/* Meta interpreter in Picat v3. Run as $ picat -g bp.go meta_interpreter_bp_v3.pi This Picat model was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ % This loads Prolog so we don't have to use bp.<...> import bp. main :- go. % Picat/B-Prolog requires that the clauses are asserted % for use with clause/2-3 go :- assert(memberx(X,[X|_])), assert((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. % memberx(X,[X|_]). % memberx(X,[_|R]) :- memberx(X,R). % 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) :- % clause(G,Body), % clause_tree(Body). /* grow branches */ clause_tree(true) :- !. clause_tree((G,R)) :- !, clause_tree(G), clause_tree(R). clause_tree(G) :- predicate_property(G,built_in), call(G). %% let Prolog do it clause_tree(G) :- clause(G,Body), clause_tree(Body).