我正在寻找一种简单/直接的方法来编写一条规则,在证明搜索(子目标的成功)中输出先行条件。假设我有代码
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代码,我可以将其转换为经典的一阶逻辑(列表有点问题)。
谢谢!
发布于 2019-03-15 15:12:19
看看Guy的建议,下面是解决方案:
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).https://stackoverflow.com/questions/55089174
复制相似问题