Prolog 在验证搜索中返回子目标的序言规则

Prolog 在验证搜索中返回子目标的序言规则,prolog,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)] ] 我

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

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)]
]
我知道
跟踪/0
,但我正在寻找一条规则。我还尝试了
子句/2
,但这只是获取目标事件发生的子句,而不是之前的任何先行项

我的动机是我对构建一个为事件提供解释的系统感兴趣。我知道我可以在知识库中做
原因([rich(X)、health(X)]、happy(X))
,但我正在寻找干净简单的Prolog代码,我可以将其转换为经典的一阶逻辑(列表有点问题)


谢谢

看看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).

根据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).

为什么使用
事件/1
而不是直接使用目标?@重复事件在这里并不重要;这只是我的实际程序的剩余部分,谓词属于不同的类。@重复为了清晰起见,我将更新代码。有趣的是:为什么使用
event/1
而不直接使用目标?@repeat event在这里不重要;这只是我的实际程序的剩余部分,谓词属于不同的类。@重复一遍,为了清晰起见,我将更新代码。有趣的是: