% File : pfcjust.pl % Author : Tim Finin, finin@prc.unisys.com % Author : Dave Matuszek, dave@prc.unisys.com % Updated: % Purpose: predicates for accessing Pfc justifications. % Status: more or less working. % Bugs: %= *** predicates for exploring supports of a fact ***** :- module(pfcjust, []). :- use_module(library(pfc_pack_xform)). :- use_module(library(lists)). justification(F,J) :- supports(F,J). justifications(F,Js) :- bagof(J,justification(F,J),Js). %% base(P,L) - is true iff L is a list of "base" facts which, taken %% together, allows us to deduce P. A base fact is an axiom (a fact %% added by the user or a raw Prolog fact (i.e. one w/o any support)) %% or an assumption. base(F,[F]) :- (axiom(F) ; assumption(F)),!. base(F,L) :- % i.e. (reduce 'append (map 'base (justification f))) justification(F,Js), bases(Js,L). %% bases(L1,L2) is true if list L2 represents the union of all of the %% facts on which some conclusion in list L1 is based. bases([],[]). bases([X|Rest],L) :- base(X,Bx), bases(Rest,Br), pfcUnion(Bx,Br,L). %- axiom(F) :- %- pfcGetSupport(F,(user,user)); %- pfcGetSupport(F,(god,god)). axiom(F) :- umt(((pfcGetSupport(F,UU), \+ \+ is_axiom_support(UU)))). pfcCurrentUserSupport(UU):- get_source_ref(UU). %pfcCurrentUserSupport((user,user)). %is_axiom_support(UU):- pfcCurrentUserSupport(UU). is_axiom_support((_,AX)):- atomic(AX). %% an assumption is a failed goal, i.e. were assuming that our failure to %% prove P is a proof of not(P) assumption(P) :- pfc_negation(P,_). %% assumptions(X,As) if As is a set of assumptions which underly X. assumptions(X,[X]) :- assumption(X). assumptions(X,[]) :- axiom(X). assumptions(X,L) :- justification(X,Js), assumptions1(Js,L). assumptions1([],[]). assumptions1([X|Rest],L) :- assumptions(X,Bx), assumptions1(Rest,Br), pfcUnion(Bx,Br,L). %% pfcProofTree(P,T) the proof tree for P is T where a proof tree is %% of the form %% %% [P , J1, J2, ;;; Jn] each Ji is an independent P justifier. %% ^ and has the form of %% [J11, J12,... J1n] a list of proof trees. %% mpred_child(+P,?Q) is nondet. % % mpred_child(P,Q) is true iff P is an immediate justifier for Q. % mpred_child(P,Q) :- pfcGetSupport(Q,(P,_)). mpred_child(P,Q) :- pfcGetSupport(Q,(_,Trig)), pfcType(Trig,trigger), mpred_child(P,Trig). mpred_children(P,L) :- bagof(C,mpred_child(P,C),L). % pfcDescendant(P,Q) is true iff P is a justifier for Q. pfcDescendant(P,Q) :- pfcDescendant1(P,Q,[]). pfcDescendant1(P,Q,Seen) :- mpred_child(X,Q), (\+ member(X,Seen)), (P=X ; pfcDescendant1(P,X,[X|Seen])). pfcDescendants(P,L) :- bagof(Q,pfcDescendant1(P,Q,[]),L).