gpt4 book ai didi

prolog - 如何正确表达序言中的不等式?

转载 作者:行者123 更新时间:2023-12-05 00:20:52 25 4
gpt4 key购买 nike

TL;DR: sibling(a,X)答案成功X = a , 但是 sibling(a,a)失败。

我有以下 Prolog 文件:

children(a, c).
children(a, d).
children(b, c).
children(b, d).

sibling(X, Y) :-
X \== Y, A \== B,
children(X, A), children(X, B),
children(Y, A), children(Y, B).

对我来说似乎很清楚,如果他们的 parent 相同,两个人就是 sibling 。此外,一个人不是他们自己的 sibling 。

但是当我尝试在 GNU Prolog 上运行一些查询时,我得到了一些奇怪的结果:
| ?- sibling(a, b).

true ? a

true

true

yes

这是预期的行为。 ab是 sibling 。有三个结果,有点奇怪,但我假设 Prolog 正在绑定(bind) A = c, B = dA = d, B = c .
| ?- sibling(a, a).

no

我认为这意味着 aa不是 sibling 。
| ?- sibling(a, X).

X = a ? a

X = b

X = a

X = b

X = a

X = b

X = a

X = b

(15 ms) yes

这就是我卡住的地方:它说 X = a , 这意味着 sibling(a,a)是真的,但是 sibling(a,a)上一个查询失败!

感觉没看懂 \==实际上在 Prolog 中确实如此。

发生了什么,我该如何解决?

最佳答案

TL;DR: 使用 — 或 iso_dif/2 (在 上符合 等系统)!

好问题,+1!

其实这是我问过自己的一个问题,答案和有关:逻辑纯度是什么的核心方面
使 Prolog 作为一种语言如此特别,因为它使您能够:

  • 描述—不规定
  • 编写关系型代码——不仅仅是功能性的
  • 从问题/解决方案的角度思考——而不是搜索过程本身的各个步骤
  • 在更高的层次上运作——不要迷失在细节中

  • 与许多其他编程语言不同,Prolog 程序具有过程语义(定义执行步骤及其顺序)和声明语义(允许您声明应该保持的关系并让 Prolog 处理器自行找到正确的执行方式)。

    但是,请注意:Prolog 的某些功能在使用时会破坏声明性语义。为防止这种情况,请尝试将您的应用程序分为两部分: 不纯的外壳用于处理副作用(输入/输出) 一个 逻辑纯基其中包括纯单调 Prolog 代码。

    关于prolog - 如何正确表达序言中的不等式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33448127/

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