Prolog 使用=&引用;在序言中
我想知道当我尝试这样做时,为什么我的SWI Prolog会出错:Prolog 使用=&引用;在序言中,prolog,Prolog,我想知道当我尝试这样做时,为什么我的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” 它不识别第一行中的“=”,但第二行“编译”。我猜它只接受:-后面的“=”?为什么? 我是否需要为
(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)”
?,因为=
是一个预定义的谓词。您实际编写的是(使用Martelli-Montanari算法的术语基础):
在Prolog中使用类似于函数的谓词
您可以定义如下内容:
terminal(X) :- signal(X,1);signal(X,0).
其中,signal/2
是包含键/值对的谓词
以及:
Diedre-Prolog中没有“函数”。有谓词。通常的模式 去 名称(要统一的参数列表):-谓词体 通常,您希望:-运算符左侧的内容是谓词 名称当你写作时 (信号(X)=信号(Y)) =是一个运算符,因此您可以 “=”(信号(X)、信号(Y)) 但是(我们假设,现在还不清楚你在做什么)你并不真的想改变。 因为“=”已经在标准库中,所以不能重新定义它(也不想重新定义) 你可能想要的是 等信号(X,Y):-。。。一堆东西。 或 等信号(信号(X)、信号(Y)):-。。。一堆东西 这似乎是一个概念上的错误问题。你需要和理解它的人交谈。我可能会谦虚地建议您在freenode.net或
一些类似的论坛,找人解释一下。只要把它重命名为
equal\u signals(X,Y):-…
=/2
是一个系统谓词,您不能也不需要在此处更改它。(信号(t)=1)或(信号(t)=0)
将Prolog转换为信号(t,S),(S=1;S=0)
。如果您有一个“函数”信号
,它的“返回”结果是它的第二个参数,则会出现这种情况。但你的问题中没有任何解释,我们只能猜测。也许你可以先解释一下你拥有什么,其中“世界”是你的问题集,以及你想要实现什么。=(信号(X),信号(Y)):-终端(X),终端(Y),连接(X,Y)。这我也犯了同样的错误…当然。我要说的是,你的目标是覆盖一个系统谓词。那样做是不明智的。此外,还可以使用信号
作为函数。Prolog使用赫伯兰宇宙。因此,signal(a)
仅等于signal(a)
(而不是0
,1
,等等)。谢谢您的回答。实现函数的唯一方法是:信号(x,y)?然后我应该检查Y值并为它创建规则?这就是我在网上找到的。我想做的是把这些一阶逻辑放在prolog中:t1,t2(终端(t1)和终端(t2)并连接(t1,t2))->(信号(t1)=信号(t2))- t终端(t)->(信号(t)=1)或(信号(t)=0)就我所知,我们无法做到这一点(当然,除非您用Prolog编写自己的元编译器)。函数实际上是使用带有(x,y)
元组的谓词p/2
实现的。请注意,这是一张地图,例如,一个键x
可以有多个y
sI,用于在人工智能中学习逻辑,但我从未使用过prolog。我发现prolog语言在语法上与一阶逻辑截然不同。非常感谢您的回答!是的,Prolog基于Horn子句,一阶逻辑的一个子集。在我看来,这并不是Prolog与一阶逻辑不同的基本方面:有限失效、极小模型、封闭世界假设、Herbrand建模等否定也有很大不同。
terminal(X) :- signal(X,1);signal(X,0).
equal_signal(X,Y) :- terminal(X),terminal(Y),connected(X,Y).