/* Meta interpreter in Picat v3. See meta_interpreter_bp_v3_.pi for a version with "import bp". This Picat model was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ % import bp. main => go. go ?=> bp.assert($memberx(X,[X|_])), bp.assert($(memberx(X,[_|R]) :- memberx(X,R))), % This don't work: % cl_facts($[ % (memberx(X,[X|_])), % (memberx(X,[_|R]) :- memberx(X,R)) % ]), clause_tree($memberx(X,[a,b,c])), writeln(X), fail, nl. go => true. go2 => clause_tree($(Y is 3, Y < 5)), writeln(Y), nl. go2 => true. % From % https://www.cpp.edu/~jrfisher/www/prolog_tutorial/pt_framer.html % https://www.cpp.edu/~jrfisher/www/prolog_tutorial/3_3.html % clause_tree(true) :- !. /* true leaf */ % clause_tree((G,R)) :- % !, % clause_tree(G), % clause_tree(R). /* search each branch */ % clause_tree(G) :- % bp.clause(G,Body), % clause_tree(Body). /* grow branches */ % memberx(X,[X|_]). % memberx(X,[_|R]) :- memberx(X,R). clause_tree(true) :- !. clause_tree((G,R)) :- !, clause_tree(G), clause_tree(R). clause_tree(G) :- bp.predicate_property(G,built_in), bp.call(G). %% let Prolog do it clause_tree(G) :- bp.clause(G,Body), clause_tree(Body).