gpt4 book ai didi

prolog - Prolog 中的可选绑定(bind)

转载 作者:行者123 更新时间:2023-12-01 11:16:17 27 4
gpt4 key购买 nike

让我们想象一个简单的家谱数据库,其中 mother(M, C)father(F, C) 表示 M/F 是 child C 的母亲/父亲。

我写了一条规则来查找 child 的已知 parent (零个、一个或两个):

parents(C, M, F) :-
(mother(M, C) -> true; true),
(father(M, C) -> true; true).

如果已知 MF 则绑定(bind)它们,否则不绑定(bind)它们。

它工作正常,这意味着对于一组事实:

mother(m1, c1).
father(f1, c1).
mother(m2, c2).

调用 parents(c1, M, F) 返回:

M = m1,
F = f1.

parents(c2, M, F) 返回:

M = m2.

但是箭头运算符的使用对我来说似乎有点奇怪。我错过了一些基本的东西吗?是否可以避免/简化 (X -> true ; true) 调用?

感谢任何帮助。

干杯,

最佳答案

从逻辑的角度来看,这个程序的一个主要错误是它的不完整

例如考虑最一般的查询:

?- parents(X, Y, C).X = c1,Y = m1.

因此,没有针对 c2 的解决方案被报告。

但是这样的解决方案是存在的,可以看出:

?- parents(c2, Y, C).Y = m2.

所以,是什么,有没有解决办法?

如果您使用(->)/2 和其他违反代码逻辑纯度 的结构,这样的错误几乎总是发生。请看获取更多信息。

因此,从逻辑的角度来看,我只能建议避免这样的构造,因为它们首先破坏了逻辑编程语言的主要优势:逻辑推理的能力 关于你的程序。

相反,着重于对您要描述的关系进行清晰的描述,并说明使它们成立的条件。这将允许您以合理的方式使用您的 Prolog 程序。

编辑:我发现您更喜欢拙劣的程序。为此,我建议使用 ignore/1ignore(Goal)Goal 作为 once(Goal) 调用,成功。您可以使用它来简化您的程序并仍然确保它保持不完整。

关于prolog - Prolog 中的可选绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50680841/

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