如果这是一个新手问题,很抱歉,但最近我试图比较一个字符串,我使用了这个(不完全是:p):
some_fact('Yes').
some_fact('No').
some_rule(X):- some_fact(X), (X =:= 'Yes' -> writeln("ISS YES") ; writeln("No")).
错误:算术:"是"不是函数
之后,我在谷歌上搜索,发现Strings与=和\=进行了比较
但如果我写:X=5,我将值5赋给X,我不知道这个词是否是assign,因为assign运算符是。正确的
以防万一,我不需要修复代码,我想了解发生了什么。感谢
我认为这里有很多困惑,大部分都可以通过阅读一本书来弥补,但让我现在为您澄清一些事情。
-
'Yes'
是一个原子,而不是字符串。SWI-Prolog有实际的字符串,但大多数Prolog实现没有,而是使用原子。原子的好处是,如果它们是小写并且不包含空格,就不需要引号。需要引号来告诉Prolog"这不是一个变量",并解决this and 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的绑定。标准Prolog不能像这样"逆向工作"。但对于一个完全的初学者来说,可以说算术的工作方式与你预期的不同,也与Prolog的其他部分不同,除非你使用CLPFD。 -
CCD_ 11是一个算术等式运算符。您可以使用它来回答类似
6 + 1 =:= 5 + 2
的问题。这是一个非常特殊的工具,我个人从来没有真正需要使用过。