Prolog中的=运算符是如何工作的



如果这是一个新手问题,很抱歉,但最近我试图比较一个字符串,我使用了这个(不完全是: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运算符是。正确的

以防万一,我不需要修复代码,我想了解发生了什么。感谢

我认为这里有很多困惑,大部分都可以通过阅读一本书来弥补,但让我现在为您澄清一些事情。

  1. 'Yes'是一个原子,而不是字符串。SWI-Prolog有实际的字符串,但大多数Prolog实现没有,而是使用原子。原子的好处是,如果它们是小写并且不包含空格,就不需要引号。需要引号来告诉Prolog"这不是一个变量",并解决this and that的语法歧义。

  2. 由于缺少字符串,因此没有用于字符串比较的运算符。

  3. =是统一运算符。统一是一个大话题——不是一个问题就能轻易概括的,但作为一种近似,你可以把它看作是一种双向模式匹配。因此,它将完成您可能需要字符串比较的工作,但它是Prolog中真正的计算引擎,并且以多种方式在幕后进行。

  4. Prolog没有赋值。是的,你可以给一个变量一个值。但您以后不能更改该值;X = X + 1在数学中是无意义的,在Prolog中也是无意义的。一般来说,您将递归地工作,所以当需要发生类似的事情时,您只需创建一个新的变量。当你进一步阅读Prolog和编写你的第一个程序时,它会更有意义。请查看教程!

  5. 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。

  6. CCD_ 11是一个算术等式运算符。您可以使用它来回答类似6 + 1 =:= 5 + 2的问题。这是一个非常特殊的工具,我个人从来没有真正需要使用过。

相关内容

  • 没有找到相关文章

最新更新