Powered by AppSignal & Oban Pro
Would you like to see your link here? Contact us

7MLI7W MiniKanren Day 1 with exKanren

minikanren/day1/chapter.livemd

7MLI7W MiniKanren Day 1 with exKanren

Mix.install([
  {:exKanren, github: "lyons/ExKanren"}
])

Section

use MiniKanren
run_all([q]) do
  eq(q, 1)
end
use MiniKanren
run_all([q]) do
  eq(q, 1)
  eq(q, 2)
end
use MiniKanren
run_all([q]) do
  membero(q, [1, 2, 3])
end
use MiniKanren
run(2, [q]) do
  membero(q, [1, 2, 3])
end
run(5, [q]) do
  membero([1, 2, 3], q)
end
defmodule Scientists do
  def mano(p) do
    conde do
      [eq(p, :alan_turing)]
      [eq(p, :leslie_lamport)]
      [eq(p, :alonzo_church)]
      [eq(p, :john_mccarthy)]
    end
  end

  def womano(p) do
    conde do
      [eq(p, :grace_hopper)]
      [eq(p, :leslie_lamport)]
      [eq(p, :ada_lovelace)]
      [eq(p, :barbara_liskov)]
      [eq(p, :frances_allen)]
    end
  end

  def vitalo(p, s) do
    conde do
      [eq(p, :alan_turing), eq(s, :dead)]
      [eq(p, :grace_hopper), eq(s, :dead)]
      [eq(p, :leslie_lamport), eq(s, :alive)]
      [eq(p, :alonzo_church), eq(s, :dead)]
      [eq(p, :ada_lovelace), eq(s, :dead)]
      [eq(p, :barbara_liskov), eq(s, :alive)]
      [eq(p, :frances_allen), eq(s, :alive)]
      [eq(p, :john_mccarthy), eq(s, :dead)]
    end
  end

  def turingo(p, y) do
    conde do
      [eq(p, :leslie_lamport), eq(y, 2013)]
      [eq(p, :barbara_liskov), eq(y, 2008)]
      [eq(p, :frances_allen), eq(y, 2006)]
      [eq(p, :john_mccarthy), eq(y, 1971)]
    end
  end
end
run_all([q]) do
  Scientists.womano(q)
end
run_all([q]) do
  Scientists.womano(q)
  Scientists.vitalo(q, :alive)
end
run_all([q]) do
  fresh([p, y]) do
    Scientists.vitalo(p, :alive)
    Scientists.turingo(p, y)
    eq(q, {p, y})
  end
end
defmodule MyList do
  def insideo(e, l) do
    conde do
      [
        fresh([h, t]) do
          conso(h, t, l)
          eq(h, e)
        end
      ]
      [
        fresh([h, t]) do
          conso(h, t, l)
          insideo(e, t)
        end
      ]
    end
  end
end
run_all([q]) do
  MyList.insideo(q, [:a, :b, :c])
end
run(3, [q]) do
  MyList.insideo(:a, q)
end
run_all([q]) do
  MyList.insideo(:d, [:a, :b, :c, q])
end