7MLI7W MiniKanren Day 1 with exKanren
Mix.install([
{:exKanren, github: "lyons/ExKanren"}
])
Section
use MiniKanren
use MiniKanren.CLP.Tree
run_all([q]) do
membero(q, [1, 2, 3, 4])
membero(q, [2, 4, 6, 8])
end
run_all([q]) do
appendo(q, [4, 5, 6], [1, 2, 3, 4, 5, 6])
end
run_all([q]) do
appendo([1, 2, 3], q, [1, 2, 3, 4, 5, 6])
end
run_all([q]) do
appendo([1, 2, 3], [4, 5, 6], 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
def languageo(p, l) do
conde do
[eq(p, :grace_hopper), eq(l, :cobol)]
[eq(p, :barbara_liskov), eq(l, :clu)]
[eq(p, :barbara_liskov), eq(l, :argus)]
[eq(p, :john_mccarthy), eq(l, :lisp)]
end
end
def systemo(p, s) do
conde do
[eq(p, :alan_turing), eq(s, :ace)]
[eq(p, :leslie_lamport), eq(s, :latex)]
[eq(p, :alonzo_church), eq(s, :lambda_calculus)]
[eq(p, :frances_allen), eq(s, :acs)]
end
end
def scientisto(p) do
conde do
[mano(p)]
[womano(p)]
end
end
end
import Scientists
run_all([q]) do
fresh([y]) do
scientisto(q)
turingo(q, y)
end
end
defmodule FamilyTree do
@moduledoc """
Based on [Carl Barks’s duck family tree](https://en.wikipedia.org/wiki/Duck_family_(Disney)#Family_tree_by_Carl_Barks)
"""
def parento(p, c) do
conde do
[eq(p, :luke), eq(c, :gladstone)]
[eq(p, :daphne), eq(c, :gladstone)]
[eq(p, :grandma), eq(c, :daphne)]
[eq(p, :grandma), eq(c, :quackmore)]
[eq(p, :quackmore), eq(c, :donald)]
[eq(p, :hortense), eq(c, :donald)]
[eq(p, :quackmore), eq(c, :thelma)]
[eq(p, :hortense), eq(c, :thelma)]
[eq(p, :thelma), eq(c, :huey)]
[eq(p, :thelma), eq(c, :dewey)]
[eq(p, :thelma), eq(c, :louie)]
end
end
def spouseo(x, y) do
conde do
[eq(x, :luke), eq(y, :daphne)]
[eq(x, :quackmore), eq(y, :hortense)]
[eq(x, :donald), eq(y, :daisy)]
end
end
def ancestoro(x, y) do
conde do
[parento(x, y)]
[
fresh([z]) do
parento(z, y)
ancestoro(x, z)
end
]
end
end
def descendanto(x, y) do
conde do
[parento(y, x)]
[
fresh([z]) do
parento(y, z)
descendanto(x, z)
end
]
end
end
def cousino(x, y) do
fresh [px, py, gp] do
parento(px, x)
parento(py, y)
parento(gp, px)
parento(gp, py)
neq(px, py)
end
end
end
import FamilyTree
run_all([q]) do
ancestoro(q, :huey)
end
run_all([q]) do
descendanto(q, :grandma)
end
run_all CLP_Tree, [q] do
cousino q, :gladstone
end
defmodule Extendo do
def extendo(x, y, z) do
conde do
[
fresh [hx] do
conso(hx, [], x)
conso(hx, y, z)
end
]
[
fresh([hx, tx, zz]) do
conso(hx, tx, x)
conso(hx, zz, z)
extendo(tx, y, zz)
end
]
end
end
end
import Extendo
run_all [q] do
extendo(q, [4, 5, 6], [1, 2, 3, 4, 5, 6])
end
run_all [q] do
extendo([1, 2, 3], q, [1, 2, 3, 4, 5, 6])
end
run_all [q] do
extendo([1, 2, 3], [4, 5, 6], q)
end