【问题标题】:Using "=" in Prolog在 Prolog 中使用“=”
【发布时间】:2014-01-19 18:31:34
【问题描述】:

我想知道为什么当我尝试这样做时我的 SWI Prolog 出现错误:

(signal(X) = signal(Y)) :- (terminal(X), terminal(Y), connected(X,Y)).
terminal(X) :- ((signal(X) = 1);(signal(X) = 0)).

我收到以下错误

错误:trabalho.pro:13:无权修改静态过程 '(=)/2'

它无法识别第一行中的"=",但第二行“编译”。我猜它只接受 "=" 之后的 :- ?为什么?

我是否需要为此创建一个谓词:"equal(x,y) :- (x = y)"

【问题讨论】:

  • 只需将其重命名为equal_signals(X,Y):- ...=/2是系统谓词,这里不能也不需要修改。
  • (Signal(t) = 1) OR ( Signal(t) = 0) 转换为 Prolog 为 signal(T,S), (S=1 ; S=0)。如果你有一个“函数”signal,它的“返回”会导致它的第二个参数。但是您的问题中没有包含任何解释,我们只能猜测。也许你可以先解释一下你有什么,你的问题集是在哪个“世界”中,你想达到什么目标。

标签: prolog


【解决方案1】:

Diedre - Prolog 中没有“函数”。有谓词。通常的模式 去

名称(要统一的参数列表):- 谓词主体。

通常您希望 :- 运算符左侧的东西成为谓词 姓名。当你写

(信号(X) = 信号(Y))

= 是一个运算符,所以你得到

'='(信号(X), 信号(Y))

但是(我们假设,不清楚你在这里做什么)你真的不想改变 equals。 由于 '=' 已经在标准库中,你不能重新定义它(也不想)

你可能想要的是

equal_signal(X, Y) :- ...一堆东西...。 或

equal_signal(signal(X), signal(Y)) :- ...一堆东西...。

这似乎是一个概念性错误问题。您需要与了解它的人进行对话。我可能会谦虚地建议您在 freenode.net 上弹出 ##prolog 或 一些类似的论坛,并请人解释一下。

【讨论】:

  • 我正在研究人工智能中的逻辑,但我从未使用过 prolog。我看到序言语言与语法中的一阶逻辑风筝不同。非常感谢您的回答!
  • 是的 - Prolog 基于 Horn 子句,一阶逻辑的子集。
  • 在我看来,这不是使 Prolog 与一阶逻辑不同的基本方面:作为有限失败、最小模型、封闭世界假设、Herbrand 建模的否定也完全不同。
【解决方案2】:

因为= 是一个预定义的谓词。你实际写的是(使用 Martelli-Montanari 算法的术语基础):

=(signal(X),signal(Y)) :- Foo.

你在 Prolog 中使用类似于函数的谓词。

你可以定义如下:

terminal(X) :- signal(X,1);signal(X,0).

其中signal/2 是一个包含键/值对的谓词。

还有:

equal_signal(X,Y) :- terminal(X),terminal(Y),connected(X,Y).

【讨论】:

  • =(信号(X),信号(Y)):-终端(X),终端(Y),连接(X,Y)。这?我得到了同样的错误......
  • 当然。我说的是您的目标是覆盖系统谓词。这样做是不明智的。此外,您使用 signal 作为函数。 Prolog 使用 Herbrand 宇宙。因此signal(a) 仅等于signal(a)(而不是01 等)
  • 感谢您的回答。实现函数的唯一方法是:signal(x,y)?然后我应该检查 Y 值并为其创建规则?这就是我在互联网上找到的。我想做的是把这些一阶逻辑放在序言中:t1,t2(终端(t1)和终端(t2)和连接(t1,t2))->(信号(t1)=信号(t2))-  t 终端(t) -> (信号(t) = 1) OR( 信号(t) = 0)
  • 好吧,据我所知,这是做不到的(当然,除非您在 Prolog 中编写自己的元编译器)。函数确实是使用带有(x,y) 元组的谓词p/2 实现的。请注意,这是一个映射,例如一个键 x 可以有多个 ys
猜你喜欢
  • 2011-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多