Toggle navigation
?
users online
Logout
Open hangout
Open chat for current file
% :- unknown(_, fail). and(A, B) :- A, B. abduce(P, E) :- abduce(P, [], E, [], _Seen). abduce(true, E, E, S, S) :- !. abduce((P, Q), E0, E, S0, S) :- !, abduce(P, E0, E1, S0, S1), abduce(Q, E1, E, S1, S). abduce(call(P), E0, E, S0, S) :- !, abduce(P, E0, E, S0, S). abduce(\+P, E0, E, S0, S) :- !, abduce_false(P, E0, E, [\+P | S0], S). abduce(P, E, E, S, S) :- my_member(P, E), !. abduce(P, E0, [P | E0], S0, [P | S0]) :- abducible(P), !, \+ my_member(\+P, E0). abduce(P, E0, E, S0, S) :- \+ abducible(P), !, \+ my_member(\+P, S0), clause(P, Body), abduce(Body, E0, E, [P | S0], S), \+ abduce_false(P, E, E, S, _). % like abduce but different semantics for negation abduce_false(true, E, E, S, S) :- !, fail. abduce_false((P, Q), E0, E, S0, S) :- !, (abduce_false(P, E0, E, S0, S) ; abduce_false(Q, E0, E, S0, S)). abduce_false(call(P), E0, E, S0, S) :- !, abduce_false(P, E0, E, S0, S). abduce_false(\+P, E0, E, S0, S) :- !, abduce(P, E0, E, [P | S0], S). abduce_false(P, E, E, S, S) :- my_member(\+P, E), !. abduce_false(P, E, [\+P | E], S0, [\+P | S0]) :- abducible(P), !, \+ my_member(P, E). abduce_false(P, E0, E, S0, S) :- \+ abducible(P), !, \+ my_member(P, S0), findall(Body, clause(P, Body), Bodies), abduce_false_list(Bodies, E0, E, [\+P | S0], S), \+ abduce(P, E, E, S, _). abduce_false_list([], E, E, S, S). abduce_false_list([H|T], E0, E, S0, S) :- abduce_false(H, E0, E1, S0, S1), abduce_false_list(T, E1, E, S1, S). abducible(ostrich(_)). % my_member(X, [X|_]). % my_member(X, [_|T]) :- my_member(X, T). my_member(X, List) :- member(X, List).