Prolog 序言:a';s';在变量名代表之前?

Prolog 序言:a';s';在变量名代表之前?,prolog,operators,Prolog,Operators,作为大学要求的一部分,我正在用Prolog编写一个智囊团解算器(我正在使用SWI Prolog)。我以前从未在Prolog中编程过,所以如果我没有使用正确的术语,请原谅 我在递增黑白计数器时遇到问题(表示有多少颜色处于正确位置,有多少颜色位于代码中但放错了位置) 我在网上找到了这个示例(完整代码): 我想知道:s黑色(第2行)代表什么?我注意到,如果我删除它,计数器将停止递增。所以我想这确实起了作用,但我在文档中找不到它 如果您能解释一下'\+'(第7行)应该做什么,我也将不胜感激。这段代码对我

作为大学要求的一部分,我正在用Prolog编写一个智囊团解算器(我正在使用SWI Prolog)。我以前从未在Prolog中编程过,所以如果我没有使用正确的术语,请原谅

我在递增黑白计数器时遇到问题(表示有多少颜色处于正确位置,有多少颜色位于代码中但放错了位置)

我在网上找到了这个示例(完整代码):

我想知道:s黑色(第2行)代表什么?我注意到,如果我删除它,计数器将停止递增。所以我想这确实起了作用,但我在文档中找不到它


如果您能解释一下'\+'(第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).