抱歉,如果这是一个新手问题,但最近我试图比较一个字符串并且我使用了这个(不完全是 :P):
some_fact('Yes').
some_fact('No').
some_rule(X):- some_fact(X), (X =:= 'Yes' -> writeln("ISS YES") ; writeln("No")).
错误:算术:"is"不是函数
之后Google了一下,看到Strings是跟=和\=
比较的但是如果我写:X = 5 我将值 5 赋给 X,我不知道这个词是否赋值,因为赋值运算符是是。对吧?
以防万一,我不需要修复代码,我想了解发生了什么。 谢谢
最佳答案
我认为这里有很多困惑,大部分都可以通过阅读一本书来解决,但现在让我试着为你澄清一些事情。
'Yes'
是一个原子,而不是一个字符串。 SWI-Prolog 有实际的字符串,但大多数 Prolog 实现没有,它们使用原子代替。原子的好处在于,如果它们是小写字母并且不包含空格,则不需要引号。需要引号来告诉 Prolog“这不是变量”并解决this 和 that
的语法歧义。缺少字符串,就没有字符串比较的运算符。
=
是合一运算符。统一是一个很大的话题——不是很容易用一个问题来概括的东西,但作为一种近似,你可以把它看作是一种双向模式匹配。因此,它可以完成您可能需要进行字符串比较的工作,但它是 Prolog 中真正的计算引擎,并且以多种方式在幕后发生。Prolog 没有赋值。没错,你可以给一个变量一个值。但是您以后不能更改该值;
X = X + 1
在数学中没有意义,在 Prolog 中也没有意义。通常,您将以递归方式工作,因此当需要发生此类事情时,您只需创建一个新变量即可。当你进一步阅读 Prolog 和编写你的第一个程序时,它会更有意义。请查看教程!is/2
解析算术表达式。如果您有X = 2+3
,Prolog 将回复X = 2+3
。只有X is 2+3
会导致 Prolog 报告X=5
。算术并不是经典 Prolog 用法的重要组成部分;现在,人们会很快建议您查看 CLPFD,它使您能够做更多有趣的事情,例如15 #= X + Y
并生成总和为 15 的绑定(bind)。标准 Prolog 不能“逆向工作”像这样。但是对于一个完全的初学者来说,除非您使用 CLPFD,否则可能足以说算术的工作方式与您预期的不同,并且与 Prolog 的其余部分不同。=:=
是算术相等运算符。您可以使用它来回答诸如6 + 1 =:= 5 + 2
之类的问题。这是一个非常特殊的工具,我个人从未真正需要使用它。
关于prolog - =运算符如何在Prolog中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47154641/