prolog - =运算符如何在Prolog中工作

标签 prolog logical-operators

抱歉,如果这是一个新手问题,但最近我试图比较一个字符串并且我使用了这个(不完全是 :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,我不知道这个词是否赋值,因为赋值运算符是。对吧?

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

最佳答案

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

  1. 'Yes' 是一个原子,而不是一个字符串。 SWI-Prolog 有实际的字符串,但大多数 Prolog 实现没有,它们使用原子代替。原子的好处在于,如果它们是小写字母并且不包含空格,则不需要引号。需要引号来告诉 Prolog“这不是变量”并解决 this 和 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 的绑定(bind)。标准 Prolog 不能“逆向工作”像这样。但是对于一个完全的初学者来说,除非您使用 CLPFD,否则可能足以说算术的工作方式与您预期的不同,并且与 Prolog 的其余部分不同。

  6. =:= 是算术相等运算符。您可以使用它来回答诸如 6 + 1 =:= 5 + 2 之类的问题。这是一个非常特殊的工具,我个人从未真正需要使用它。

关于prolog - =运算符如何在Prolog中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47154641/

相关文章:

list - 如何在序言中转置矩阵

c# - Dictionary<List<_>> 是否符合半持久性?

bit-manipulation - COBOL 中的按位逻辑运算符?

Prolog:如何编写(和使用)列出所有列表排列的函数?

prolog - 使用 in_set/2 约束

Prolog - 类似 gensym,但用于变量

php - "<>"和 "!="有什么区别?

python - python中是否有蕴涵逻辑运算符?

c++ - 双重否定以检查 not NULL

python - 按位 "&"ing 未指定数量的数据帧掩码?