Prolog:变量名前的 's' 代表什么?

Prolog: what does a 's' before a variable name stand for?

作为大学要求的一部分,我正在使用 Prolog(我使用的是 SWI-Prolog)编写 Mastermind 求解器。我以前从未在 Prolog 中编程过,所以如果我使用的术语不正确,请原谅。

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

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

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).

我想知道:"s Black"(第 2 行) 中的 's' 代表什么?我注意到如果我删除它,计数器将停止递增。所以我想这在某种程度上可以解决问题,但我在文档中找不到它。

如果您能解释一下 '\+'(第 7 行) 应该做什么,我将不胜感激。这段代码对我的水平来说有点太高级了,我正在努力......

看起来这是一个更大程序的片段。这里的 s 通常用于在递归中建立或减少列表。

你可以看到 s 一种通配符。该语句的想法是找到所有末尾有 Black 的行并附加到现有列表。

本身s(或任何其他函子,就此而言)没有任何内在意义。

它在 Prolog 代码(和查询)中的使用方式具有意义。


从您的问题链接到的 MASTERMIND.PL 源代码可以看出,一元前缀运算符 s/1 被用于 extend_code/1(第 110 行)、finished/1(第 173 行)、determine_blacks/5(第 231 行)和 determine_whites/5(第 247 行)。

s/1 在第 54 行中定义为一元前缀运算符 1:

:- op(150, fy, s).

所有这一切都允许我们写 s s s 0 而不是 s(s(s(0)))

在我看来,这没有任何好处无论如何


脚注 1: 有关 Prolog 运算符的更多信息,请阅读 this part of the SICStus Prolog manual