%------------------------------------------------------------------------ % Program that goes into an infinite loop. Also check what happens % when both interp_g/1 and interp/1 are tabled (used to give error % message of wrong delay list). % % Model T = {q}, F = {p,r}, U = {}. %------------------------------------------------------------------------ :- dynamic rule/2. :- table interp_g/1. interp([]). interp([G|Gs]) :- interp_g(G),interp(Gs). interp_g(tnot(G)) :- tnot(interp_g(G)). interp_g(G) :- rule(G,B),interp(B). %------------------------------------------------------------------------------- test :- new_program, query(Goal), interp_g(Goal), fail. %%%/* test :- ( interp_g(p) -> ( tnot(interp_g(p)) -> writeln('i(p) is undefined') ; writeln('i(p) is true') ) ; writeln('i(p) is false (OK)') ), ( interp_g(q) -> ( tnot(interp_g(q)) -> writeln('i(q) is undefined') ; writeln('i(q) is true (OK)') ) ; writeln('i(q) is false') ), ( interp_g(r) -> ( tnot(interp_g(r)) -> writeln('i(r) is undefined') ; writeln('i(r) is true') ) ; writeln('i(r) is false (OK)') ), fail. %%% */ test :- writeln('Program interp3 finished execution...'). %------------------------------------------------------------------------------- new_program :- cleanup, assert(query(r)), assert(rule(p, [tnot(q),p])), assert(rule(r, [r])), % causes infinite loop assert(rule(q, [tnot(p)])), assert(rule(r, [tnot(q)])). cleanup :- retractall(query(_)), retractall(rule(_,_)), abolish_all_tables.