Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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_Singleton - Fatal编程技术网

Prolog 序言-是否有必要删除;“单例变量”;在陈述事实时发出警告?

Prolog 序言-是否有必要删除;“单例变量”;在陈述事实时发出警告?,prolog,singleton,Prolog,Singleton,在将此问题标记为重复问题之前,请注意,我已经完成了类似的问题,但我的问题有点不同 我不熟悉Prolog,这里有一个简单的代码,可以计算一个数乘以另一个数的幂的结果。(X^Y) 这是代码电源.pl: power(X,0,1). power(X,Y,Z):- Y > 0, Y1 is Y-1, power(X,Y1,Z1), Z is X*Z1. power(X,Y,Z):- Y < 0, Y1 is -1*Y, Y2 is Y1-1, X1 is 1/X, power(X1,Y2,Z

在将此问题标记为重复问题之前,请注意,我已经完成了类似的问题,但我的问题有点不同

我不熟悉Prolog,这里有一个简单的代码,可以计算一个数乘以另一个数的幂的结果。(X^Y)

这是代码<代码>电源.pl:

power(X,0,1).

power(X,Y,Z):- Y > 0, Y1 is Y-1, power(X,Y1,Z1), Z is X*Z1.
power(X,Y,Z):- Y < 0, Y1 is -1*Y, Y2 is Y1-1, X1 is 1/X, power(X1,Y2,Z1), Z is X*Z1.
幂(X,0,1)。
功率(X,Y,Z):-Y>0,Y1是Y-1,功率(X,Y1,Z1),Z是X*Z1。
功率(X,Y,Z):-Y<0,Y1为-1*Y,Y2为Y1-1,X1为1/X,功率(X1,Y2,Z1),Z为X*Z1。
当我尝试使用
SWI-PROLOG
[power]命令运行此命令时。
它会给我一个
单例变量:[X]
警告

我从中发现,如果我在第一行使用
power(\u0,1)。
,那么一切都会正常工作

这段代码是由我的老师提供的,他并没有解释任何东西。但我必须从中学到基本的序言。我的老师说这个警告并不令人头痛,因为SWI-PROLOG是有缺陷的,并且一直在发出这样的警告。我真的不相信这个。我的意思是,它被广泛使用,这车能这么多吗?显示此警告必须有原因

我的问题是:

1-
power(X,0,1)
是一个
事实
,据我所知,为什么会给出这个警告?
prolog
是否希望我在陈述
事实时使用
变量

2-我真的应该担心这个
警告
,还是让它发生。当显示警告时,我真的不舒服。这是一个有原因的警告

对不起,如果我在这件事上遗漏了任何基本概念。我是新手。
谢谢。

您提出的所有问题都会在链接到的问题中得到解答

请特别参阅,清楚解释SWI发出警告的原因以及避免警告的不同方法。它甚至链接到手册,说明SWI的行为完全符合文件规定和预期

请参阅以获得更多适用于本例的信息:也许是时候抛开80年代,使用更通用的算法了,这样您就可以在各个方向上使用代码了


简而言之:如其他答案中所述,将变量标记为singleton以避免(通常非常有用)警告。

您提出的所有问题都会在您链接的问题中得到回答

请特别参阅,清楚解释SWI发出警告的原因以及避免警告的不同方法。它甚至链接到手册,说明SWI的行为完全符合文件规定和预期

请参阅以获得更多适用于本例的信息:也许是时候抛开80年代,使用更通用的算法了,这样您就可以在各个方向上使用代码了

简言之:正如其他答案中所解释的,将变量标记为singleton以避免(通常非常有用)警告。

从技术上讲,如果您真的打算按照编写的代码来编写代码,则不必消除singleton警告。就像在其他语言中一样,如果你真的知道自己在做什么,警告可能会被忽略。出现警告是因为编译器或解释器让您知道某些内容可能不正确。通常,编译器或解释器是正确的,并且程序员发现了错误(例如,拼写错误的变量)。或者它可能是脆弱代码的一个标志,现在可能可以工作,但在极端情况下可能会失败,或者周围有轻微的变化

强烈建议您消除警告,以便您和可能需要阅读您的代码的任何其他人都能清楚地了解您的编程逻辑意图,并确保您是有意而非错误地执行了某些操作。理想情况下,您唯一允许保留警告的时间是,如果您无法使用任何清晰的编程结构消除它。警告的存在是一个不整洁或更极端的草率程序的普遍标志

在这种特殊情况下,
power(u,0,1)。
power(X,0,1)更好地表达逻辑。
power(u,0,1)。
表示,任何变量取幂
0
,都会产生
1
。而不是,
power(X,0,1)。
表示一个变量
X
,取幂
0
,得到
1
,这就引出了一个问题,
X
有什么具体的东西没有在这里说明

当然,我们一直忽略了
0
的未定义情况,将其转换为
0
幂,因此实际上,它应该是
power(X,0,1):-X=\=0。
:)

从技术上讲,如果您真的打算按照编写的代码来编写代码,则不必消除单例警告。就像在其他语言中一样,如果你真的知道自己在做什么,警告可能会被忽略。出现警告是因为编译器或解释器让您知道某些内容可能不正确。通常,编译器或解释器是正确的,并且程序员发现了错误(例如,拼写错误的变量)。或者它可能是脆弱代码的一个标志,现在可能可以工作,但在极端情况下可能会失败,或者周围有轻微的变化

强烈建议您消除警告,以便您和可能需要阅读您的代码的任何其他人都能清楚地了解您的编程逻辑意图,并确保您是有意而非错误地执行了某些操作。理想情况下,您唯一允许保留警告的时间是,如果您无法使用任何清晰的编程结构消除它。警告的存在是一个不整洁或更极端的草率程序的普遍标志

在这种特殊情况下,
power(u,0,1)。
power(X,0,1)更好地表达逻辑。
power(u,0,1)。
表示,取幂的任何变量
0