我在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).
我在想:'是什么? in" s Black" (第2行)代表什么?我注意到如果我将其删除,计数器将停止递增。所以我想这就是诀窍,但我无法在文档中找到它。
如果你能解释一下' \ +' (第7行)应该这样做。这段代码对我的水平来说有点太高级了,而且我正在努力...
答案 0 :(得分:3)
本身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。
答案 1 :(得分:2)
看起来这是一个更大程序的片段。这里的s
通常用于构建或减少递归列表。
您可以看到s
一种通配符。这个陈述的想法是找到末尾有Black
并附加到现有列表的所有行。