在证明搜索中返回子目标的Prolog规则

时间:2019-03-10 15:21:01

标签: prolog

我正在寻找一种简单/直接的方法来编写规则,以在证明搜索(子目标的成功)中输出先决条件。假设我有代码

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代码,可以将其转换为经典的一阶逻辑(列表有些问题)。

谢谢!

1 个答案:

答案 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).