首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在证明搜索中返回子目标的Prolog规则

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

Stack Overflow用户
提问于 2019-03-10 23:21:01
回答 1查看 92关注 0票数 1

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

代码语言:javascript
复制
winsLottery(john).
healthy(john).
rich(X):-winsLottery(X).
happy(X):-rich(X), healthy(X).

我想要一个规则antecedents(L, happy(john)),它返回

代码语言:javascript
复制
L = [
[rich(john), healthy(john)],
[winsLottery(john), healthy(john)]
]

我知道trace/0,但我在寻找一条规则。我也尝试了clause/2,但这只得到了目标事件发生的子句,而不是之前的任何先行事件。

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

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-15 15:12:19

看看Guy的建议,下面是解决方案:

代码语言:javascript
复制
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).
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55089174

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档