happy/t :- rich/t,healthy/t. happy/t :- tranquility /hi. tranquility/hi :- conscience/clear. tranquility/hi :- satiated/t. satiated/t :- diet/fatty. healthy/t :- diet/light. /*
rich/t.
%tim/f. %satiated/f. /*
todo/t :- happy/t. /*
Here's one run.
?- goes. % assumptions 0* (diet/light) 1* (rich/t) 2* (happy/t) 2* (healthy/t) 2* (todo/t)
% assumptions 0* (conscience/clear) 2* (happy/t) 2* (todo/t) 2* (tranquility/hi)
% assumptions 0* (diet/fatty) 2* (happy/t) 2* (satiated/t) 2* (todo/t) 2* (tranquility/hi)
Here's anohter run. Hmmm... different order. Why?
?- goes. % assumptions 0* (diet/light) 1* (rich/t) 2* (happy/t) 2* (healthy/t) 2* (todo/t)
% assumptions 0* (diet/fatty) 2* (happy/t) 2* (satiated/t) 2* (todo/t) 2* (tranquility/hi)
% assumptions 0* (conscience/clear) 2* (happy/t) 2* (todo/t) 2* (tranquility/hi)
reset :- dynamic(assuption/3), retractall(assumption(_,_,_)).
report :- write('% assumptions\n'), report1, fail. report :- nl.
report1 :- setof(Z*(X/Y),assumption(X,Y,Z),All), member(One,All), write(One), nl. /*
=head2 Standard stuff */
goes :- go, fail. goes.
goes(X) :- go(X),fail. goes(_).
go :- reset, run, report. go(X) :- reset, run(X), report.
run :- maybe(todo/t). run(X) :- maybe(X). /*
assume(X/Y,_) :- assumption(X,Z,_),!,Y=Z. assume(X/Y,How) :- bassert(assumption(X,Y,How)).
bassert(X) :- assert(X). bassert(X) :- retract(X),fail. /*
maybe(X) :- once(maybe0(X,Y)), maybe1(Y).
maybe0((X,Y), (X,Y)). maybe0(X/Y, fact(X/Y)) :- clause(X /_,true). maybe0(X/Y, rule(X/Y)) :- clause(X/_,_). maybe0(X/Y, abducible(X/Y)).
maybe1((X,Y)) :- maybe(X),maybe(Y). maybe1(abducible(X)) :- assume(X,0). maybe1(fact(X)) :- assume(X,1), one(X). maybe1(rule(X)) :- assume(X,2), one(clause(X,Y)), maybe(Y). /*
Return solutions to goal X
, in some random order. */
one(X) :- setof(N/X,(X, N is random(10000)), All), member(_/X,All).