我正在寻找一种简单/直接的方法来编写规则,以在证明搜索(子目标的成功)中输出先决条件。假设我有代码
winsLottery(john).
healthy(john).
rich(X):-winsLottery(X).
happy(X):-rich(X), healthy(X).
我想要一条规则antecedents(L, happy(john))
,该规则返回
L = [
[rich(john), healthy(john)],
[winsLottery(john), healthy(john)]
]
我了解trace/0
,但我正在寻找一条规则。我也尝试过clause/2
,但这只是获取发生目标事件的子句,而没有任何先前的条件。
我的动机是,我有兴趣构建一个提供事件解释的系统。我知道我可以在知识库中使用causes([rich(X), healthy(X)], happy(X))
,但是我正在寻找干净,简单的Prolog代码,可以将其转换为经典的一阶逻辑(列表有些问题)。
谢谢!
答案 0 :(得分:0)
看看盖伊的建议,以下是解决方法:
main:-explain(happy(john)).
winsLottery(john).
healthy(john).
rich(X):-winsLottery(X).
happy(X):-rich(X), healthy(X).
explain(X):-
clause(X, B),
B == true.
explain((X1, X2)):-
explain(X1),
explain(X2).
explain(X):-
X \= true,
X \= (_, _),
clause(X, B),
write('An explanation for '), write(X), write(' is: '), nl, write(B), nl, nl,
explain(B).