-- Programmed by Jedidiah Barber -- Licensed under the Sunset License v1.0 -- See license.txt for further details with Ada.Text_IO, Kompsos.Pretty_Print; procedure FiveSix is package TIO renames Ada.Text_IO; package InKomp is new Kompsos (Integer); use InKomp; package InPrin is new InKomp.Pretty_Print (Integer'Image); use InPrin; function Fives (This : in Goal) return Goal is One, Two : Goal := This; begin One.Unify (One.Fresh, 5); Two.Conjunct (Fives'Access); return Disjunct (One, Two); end Fives; function Sixes (This : in Goal) return Goal is One, Two : Goal := This; begin One.Unify (One.Fresh, 6); Two.Conjunct (Sixes'Access); return Disjunct (One, Two); end Sixes; Relation : constant Goal := Disjunct (Fives (Empty_Goal), Sixes (Empty_Goal)); begin TIO.Put_Line ("Test program for fives-and-sixes example from 2013 microKanren paper."); TIO.Put_Line ("Since the result is infinite, only the first five states will be shown."); TIO.New_Line; -- Note how the States keep using new Variables instead of just reusing the same one. -- This is an unavoidable side effect of setting up Variable Terms to be manually -- created from a Goal by the programmer, instead of being supplied as needed in the -- process of evaluation. TIO.Put_Line (Image (Relation.Run (5))); end FiveSix;