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

7MLI7W MiniKanren Day 1 with exKanren

minikanren/day1/exercises.livemd

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