Prolog:什么是'变量名之前代表什么?

时间:2015-12-13 13:52:22

标签: prolog operators

我在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行)应该这样做。这段代码对我的水平来说有点太高级了,而且我正在努力...

2 个答案:

答案 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并附加到现有列表的所有行。