Current section
Files
Jump to
Current section
Files
lib/the_reasoned.ex
defmodule TheReasoned do
@moduledoc """
The Reasoned Schemer in Elixir.
"""
import Exo
def cons(a, d) do
[a | d]
end
def car(p) do
hd(p)
end
def cdr(p) do
tl(p)
end
def conso(a, d, p) do
cons(a, d) <~> p
end
def caro(p, a) do
fresh [d] do
cons(a, d) <~> p
end
end
def cdro(p, d) do
fresh [a] do
cons(a, d) <~> p
end
end
def nullo(x) do
x <~> []
end
def pairo(p) do
fresh [a, d] do
cons(a, d) <~> p
end
end
def listo(l) do
oro do
nullo(l)
fresh [d] do
pairo(l)
cdro(l, d)
listo(d)
end
end
end
def appendo(l, s, out) do
oro do
ando do nullo(l); out <~> s end
fresh [a, d, rec] do
conso(a, d, l)
appendo(d, s, rec)
conso(a, rec, out)
end
end
end
def flatteno(s, out) do
oro do
ando do nullo(s)
[] <~> out
end
ando do pairo(s)
fresh [a, d, res_a, res_d] do
conso(a, d, s)
flatteno(a, res_a)
flatteno(d, res_d)
appendo(res_a, res_d, out)
end
end
conso(s, [], out)
end
end
end