Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Prolog 使用=&引用;在序言中_Prolog - Fatal编程技术网

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” 它不识别第一行中的“=”,但第二行“编译”。我猜它只接受:-后面的“=”?为什么? 我是否需要为

我想知道当我尝试这样做时,为什么我的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)”

,因为
=
是一个预定义的谓词。您实际编写的是(使用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).