Prolog 序言:a';s';在变量名代表之前?
作为大学要求的一部分,我正在用Prolog编写一个智囊团解算器(我正在使用SWI Prolog)。我以前从未在Prolog中编程过,所以如果我没有使用正确的术语,请原谅 我在递增黑白计数器时遇到问题(表示有多少颜色处于正确位置,有多少颜色位于代码中但放错了位置) 我在网上找到了这个示例(完整代码): 我想知道:s黑色(第2行)代表什么?我注意到,如果我删除它,计数器将停止递增。所以我想这确实起了作用,但我在文档中找不到它Prolog 序言:a';s';在变量名代表之前?,prolog,operators,Prolog,Operators,作为大学要求的一部分,我正在用Prolog编写一个智囊团解算器(我正在使用SWI Prolog)。我以前从未在Prolog中编程过,所以如果我没有使用正确的术语,请原谅 我在递增黑白计数器时遇到问题(表示有多少颜色处于正确位置,有多少颜色位于代码中但放错了位置) 我在网上找到了这个示例(完整代码): 我想知道:s黑色(第2行)代表什么?我注意到,如果我删除它,计数器将停止递增。所以我想这确实起了作用,但我在文档中找不到它 如果您能解释一下'\+'(第7行)应该做什么,我也将不胜感激。这段代码对我
如果您能解释一下'\+'(第7行)应该做什么,我也将不胜感激。这段代码对我的水平来说有点太高级了,我正在努力解决它…这看起来像是一个更大的程序的片段。这里的
s
通常用于在递归中建立或减少列表
您可以看到s
是一种通配符。此语句的思想是查找所有末尾有黑色
的行,并将其附加到现有列表中 本身s
(或任何其他函子)没有任何内在意义
它通过在Prolog代码(和查询)中使用的方式获得意义
根据问题链接到的源代码,一元前缀运算符
s/1
在
扩展代码/1
(第110行)、完成/1
(第173行)、确定黑人/5
(第231行)和确定白人/5
(第247行)
s/1
定义为第54行中的一元前缀运算符1:
所有这些都允许我们编写s0
,而不是s(s(s(0))
在我看来,这没有任何好处
脚注1:有关Prolog运算符的更多信息,请阅读。是,这是一个片段。我添加了完整代码的链接。坦白地说,我不明白这些行是怎么总结的……哦,谢谢!我不知道那句话是什么意思:D@PLB. 我添加了一个指向SICStus Prolog手册相关章节的链接。。。享受吧!哦,太好了,我想一定是这样的。顺便说一句,对于初学者,我认为最好坚持使用
s(s(s(0))
符号。运算符是高级概念。Prolog一开始就很难学(特别是对于那些习惯于Java和C#等过程性/声明性编程语言的人来说),谢谢你的链接#还有一件事:“\+”做什么?@SQLOTL。在没有充分理由的情况下添加操作符(我指的是真正充分的理由)是在自找麻烦。这是可以做到的,但在大多数情况下最好不要这样做。。。
determine_blacks([],[],[],[],0).
determine_blacks([Color|Try],[Color|Code],ReducedTry,ReducedCode,s Black) :-
determine_blacks(Try,Code,ReducedTry,ReducedCode,Black).
determine_blacks([Color1|Try],[Color2|Code],
[Color1|ReducedTry],[Color2|ReducedCode],Black) :-
color(_,Color1), color(_,Color2),
\+(Color1 == Color2),
determine_blacks(Try,Code,ReducedTry,ReducedCode,Black).
:- op(150, fy, s).