很抱歉,如果这是一个新手问题,但最近我试图比较一个字符串,我用它(不完全是:P):
some_fact('Yes').
some_fact('No').
some_rule(X):- some_fact(X), (X =:= 'Yes' -> writeln("ISS YES") ; writeln("No")).
错误:算术:''是''不是一个功能
之后,我用谷歌搜索并看到字符串与 = 和 \ =
进行比较但是,如果我写:X = 5我将值5分配给X,那么我不知道该单词是否已分配,因为分配运算符 。正确?
以防万一,我不需要修改代码,我想了解发生了什么。 感谢
答案 0 :(得分:3)
我认为这里存在很多混淆,大部分内容都可以通过阅读一本书来解决,但现在让我试着为你解决一些问题。
'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。
=:=
是算术相等运算符。您可以使用它来回答6 + 1 =:= 5 + 2
之类的问题。这是一个非常特殊的工具,我个人从未真正需要使用它。