【问题标题】:Prolog: what does a 's' before a variable name stand for?Prolog:变量名前的“s”代表什么?
【发布时间】:2015-12-14 17:23:58
【问题描述】:

作为大学要求的一部分,我正在 Prolog 中编写 Mastermind 求解器(我正在使用 SWI-Prolog)。我以前从未在 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" (line2) 中的 's' 代表什么?我注意到如果我删除它,计数器将停止增加。所以我想这以某种方式可以解决问题,但我在文档中找不到它。

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

【问题讨论】:

    标签: prolog operators


    【解决方案1】:

    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

    【讨论】:

    • 哦,谢谢!我不知道那条线是什么意思:D
    • @PLB。我添加了指向 SICStus Prolog 手册相关部分的链接...享受吧!
    • 哦,太好了,我想它一定是这样的。顺便说一句,对于初学者,我认为最好坚持s(s(s(0))) 符号。运算符是高级概念。 Prolog 一开始就很难学(尤其是对于那些习惯于 Java 和 C# 等过程/声明式编程语言的人)
    • 感谢您的链接! #还有一件事:'\+' 有什么作用?
    • @SQLOTL。没有充分理由(我的意思是一个非常充分的理由)添加运营商是在自找麻烦。可以,但大多数情况下最好不要这样做……
    【解决方案2】:

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

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

    【讨论】:

    • 是的,它是一个 sn-p。我添加了完整代码的链接。坦率地说,我不明白 在哪里 这些行是相加的......
    猜你喜欢
    • 1970-01-01
    • 2015-02-01
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-21
    相关资源
    最近更新 更多