gpt4 book ai didi

Prolog - 更简洁的规则定义方式

转载 作者:行者123 更新时间:2023-12-01 23:14:43 25 4
gpt4 key购买 nike

刚开始使用 Prolog 进行一些编程,但我觉得我要么误解了一些概念,要么你必须有更多的规则。

我希望它检查儿子是男性并且至少有一个 parent (父亲/母亲)

% Son
son(X, Y):- male(X), father(Y, X).
son(X, Y):- male(X), mother(Y, X).

有没有什么方法可以轻松组合它,这样我就不需要两行相似的行了?可能是这样的:检查 X 是否是男性,然后检查他是否有父亲,如果没有,检查他是否有母亲。仅当 X 是男性并且有父亲和/或母亲时才返回。

最佳答案

如果你想要一个显式的析取,你可以这样写:

son(X, Y) :- male(X), (father(Y, X); mother(Y, X)).

这里我使用了 ;/2 运算符。 一个; B 首先尝试目标 A,如果不成功,则尝试 B

通过下面的数据,我们可以看出唯一的优势是male(X)查询了两次:

male(a).
father(b, a).
mother(c, a).

原始代码的踪迹:

      1    1  Call: son(a,c) ? 
2 2 Call: male(a) ?
2 2 Exit: male(a) ?
3 2 Call: father(c,a) ?
3 2 Fail: father(c,a) ?
2 2 Call: male(a) ? ; <--- just this is not queried
2 2 Exit: male(a) ?
3 2 Call: mother(c,a) ?
3 2 Exit: mother(c,a) ?
1 1 Exit: son(a,c) ?

使用 ;/2 析取跟踪新代码。

      1    1  Call: son(a,c) ? 
2 2 Call: male(a) ?
2 2 Exit: male(a) ?
3 2 Call: father(c,a) ?
3 2 Fail: father(c,a) ?
3 2 Call: mother(c,a) ?
3 2 Exit: mother(c,a) ?
1 1 Exit: son(a,c) ?

关于Prolog - 更简洁的规则定义方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69190277/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com