This library provides an example Ruby implementation of μKanren, along with some simple data structures and relations. It is intended to accompany the article “Hello, declarative world”.
That article explains the details, but here’s a brief demonstration:
$ irb -Ilib
>> require 'kanren/micro'
=> true
>> include Kanren::Micro
=> Object
>> goal = Goal.with_variables { |x, y|
Goal.either(Goal.equal(x, 1), Goal.equal(y, 2))
}
=> #<Kanren::Micro::Goal …>
>> states = goal.pursue_in(State.new)
=> #<Enumerator: …>
>> states.next.values
=> {x=>1}
>> states.next.values
=> {y=>2}
>> states.next.values
StopIteration: iteration reached an end
>> include Kanren
=> Object
>> goal = Goal.with_variables { |x|
Relations.multiply(Peano.from_integer(3), Peano.from_integer(4), x)
}
=> #<Kanren::Micro::Goal …>
>> states = goal.pursue_in(State.new)
=> #<Enumerator: …>
>> Peano.to_integer(states.next.result)
=> 12
>> goal = Goal.with_variables { |x, y|
Relations.add(x, y, Peano.from_integer(8))
}
=> #<Kanren::Micro::Goal …>
>> states = goal.pursue_in(State.new)
=> #<Enumerator: …>
>> states.each do |state|
p state.results(2).map { |peano| Peano.to_integer(peano) }
end
[0, 8]
[1, 7]
[2, 6]
[3, 5]
[4, 4]
[5, 3]
[6, 2]
[7, 1]
[8, 0]
=> nil
If you have any questions, please get in touch via Twitter or email. If you find any bugs or other problems with the code, please open an issue.