A Domain Specific Languages for logic programming
// find all lists whose 1 and 0 are both in it
let solutions : Iter[Val] = run(v =>
listo(v) &
membero(Int(1), v) &
membero(Int(0), v)
)
solutions.take(10).each(println)(1 0)
(0 1)
(1 0 _₀)
(1 _₀ 0)
(0 1 _₀)
(_₀ 1 0)
(1 0 _₀ _₁)
(0 _₀ 1)
(1 _₀ 0 _₁)
(1 _₀ _₁ 0)type Goalfn manyo(g : Goal) -> Goal {
g | delay(() => manyo(g))
}
inspect(run1(x => manyo(eqo(x, Int(1)))), content="1")inspect(run1(x => eqo(x, Int(42))), content="42")assert_eq(
list_from_array([Int(1), Int(2), Int(3)]),
Pair(Int(1), Pair(Int(2), Pair(Int(3), Nil))),
)inspect(run(x => eqo(x, Int(42))), content="[42]")inspect(run1(x => eqo(x, Int(42))), content="42")A Domain Specific Languages for logic programming