首页 > 解决方案 > Prolog 中的可选绑定

问题描述

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

我写了一条规则来查找孩子的已知父母(零个,一个或两个):

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

绑定MF如果它们是已知的,否则使它们不受约束。

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

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)可以避免/简化电话吗?

任何帮助表示赞赏。

干杯,

标签: prolog

解决方案


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

例如,考虑最一般的查询

?- 父母(X,Y,C)。
X = c1,
Y = m1。

因此,没有报告解决方案c2

但是存在这样的解决方案,如下所示:

?- 父母(c2,Y,C)。
Y = m2。

那么,它是什么,是否有解决方案?

如果您使用和其他违反代码逻辑纯度的构造,则几乎总是会出现此类错误。有关详细信息,请参阅(->)/2

因此,从逻辑的角度来看,我只能建议避免使用这种结构,因为它们一开始就破坏了逻辑编程语言的主要优势:对程序进行逻辑推理的能力。

相反,专注于对您想要描述的关系的清晰描述,并说明使它们成为真的条件。这将允许您以合理的方式使用您的 Prolog 程序。

编辑:我看到你更喜欢一个拙劣的程序。为此,我推荐ignore/1. ignore(Goal)调用Goalas once(Goal),并成功。您可以使用它来简化您的程序并仍然确保它不完整。


推荐阅读