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在这里不重要;这只是我的实际程序的剩余部分,谓词属于不同的类。@重复一遍,为了清晰起见,我将更新代码。有趣的是: