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。
作为大学要求的一部分,我正在使用 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。