:- [flux]. poss(dip(P,X),Z) :- knows_val([X],solution(X),Z), knows_val([P],litmus(P),Z), knows_not(red(P),Z). poss(sense_paper(P),Z) :- knows_val([P],litmus(P),Z). state_update(Z1,dip(P,X),Z2,[]) :- cancel(red(P),Z1,Z2), if_then_holds(acidic(X),red(P),Z2), if_then_holds(red(P),acidic(X),Z2). state_update(Z,sense_paper(P),Z,[Red]) :- Red = true, holds(red(P),Z) ; Red = false, not_holds(red(P),Z). init(Z0) :- holds(solution(a),Z0), holds(solution(b),Z0), holds(solution(c),Z0), or_holds([acidic(a),acidic(b),acidic(c)],Z0), holds(litmus(p1),Z0), holds(litmus(p2),Z0), not_holds(red(p1),Z0), not_holds(red(p2),Z0), duplicate_free(Z0). main(X) :- init(Z0), find_acidic_solution(X,Z0). find_acidic_solution(X,Z) :- knows_val([X],acidic(X),Z) -> true ; poss(dip(P,Y),Z), \+ (knows(acidic(Y),Z) ; knows_not(acidic(Y),Z)) -> execute(dip(P,Y),Z,Z1), execute(sense_paper(P),Z1,Z1), find_acidic_solution(X,Z1). perform(dip(_,_),[]). perform(sense_paper(_),[R]) :- random(N), N1 is N mod 3, ( N1=0 -> R=true ; R = false ), writeln(R).