prolog - 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).
绑定M
,F
如果它们是已知的,否则使它们不受约束。
它工作正常,这意味着对于一组事实:
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)
可以避免/简化电话吗?
任何帮助表示赞赏。
干杯,
解决方案
从逻辑的角度来看,这个程序的一个主要错误是它的不完整性。
例如,考虑最一般的查询:
?- 父母(X,Y,C)。 X = c1, Y = m1。
因此,没有报告解决方案c2
。
但是存在这样的解决方案,如下所示:
?- 父母(c2,Y,C)。 Y = m2。
那么,它是什么,是否有解决方案?
如果您使用和其他违反代码逻辑纯度的构造,则几乎总是会出现此类错误。有关详细信息,请参阅逻辑纯度。(->)/2
因此,从逻辑的角度来看,我只能建议避免使用这种结构,因为它们一开始就破坏了逻辑编程语言的主要优势:对程序进行逻辑推理的能力。
相反,专注于对您想要描述的关系的清晰描述,并说明使它们成为真的条件。这将允许您以合理的方式使用您的 Prolog 程序。
编辑:我看到你更喜欢一个拙劣的程序。为此,我推荐ignore/1
. ignore(Goal)
调用Goal
as once(Goal)
,并成功。您可以使用它来简化您的程序并仍然确保它不完整。
推荐阅读
- php - PHP POST 请求到 Android Volley POST 请求
- flutter - RadioListTile 不改变选中
- javascript - 将日期格式从 MM/DD/YYYY 编辑为 DD/MM/YYY
- visual-studio - Visual Studio 自动对齐
- c# - C#当有空单元格时按几列降序对数据表进行排序
- python - Tensorflow - Numpy 数组和形状错误
- python - 读取文本直到匹配字符串并将其打印为单行
- python - 如何更改 tkinter 窗口的内容?
- javascript - Unicode 字符无法解码
- wordpress - WordPress WP_User_Query 使用分类法