使用 DCG 编写简单的“消除过程”Prolog 代码

Posted

技术标签:

【中文标题】使用 DCG 编写简单的“消除过程”Prolog 代码【英文标题】:Writing a simple "process of elimination" Prolog code using DCGs 【发布时间】:2015-01-29 23:03:33 【问题描述】:

我将一个更复杂的问题简化为:一条街上有三栋房子,有三种不同的颜色(没有颜色重复);红色,蓝色,绿色。使用 DCG 编写程序来模拟所有排列/可能性。我的代码无法运行,我正在努力寻找原因。任何更正都会有帮助。

s --> h(X), h(Y), h(Z), X\=Y, X\=Z, Y\=Z.

h(X) --> Col(X).

Col(X) --> [red].
Col(X) --> [blue].
Col(X) --> [green].

【问题讨论】:

【参考方案1】:

s/Col/col/

然后,您使用 s//0 Prolog 目标代替非终端。这不起作用,您需要像这样使用//0“逃脱”它们

s -->h(X),h(Y),h(Z),X\=Y,X\=Z,Y\=Z.

但我宁愿写:

s --> dif(X,Y), dif(Y,Z), dif(X,Z), h(X),h(Y),h(Z).

Prolog 以这种方式为您执行所有簿记。

如果我们做到了。不要忘记通过phrase/2 调用非终端。因此:

?- phrase(s, L).

【讨论】:

我添加了大括号,但代码产生了同样的错误。 您在我的回答开头看到s/Col/col/ 吗?这意味着将Col 替换为col【参考方案2】:

您(也)忘记从叶子中“返回”值:

...
col(red)-->[red].
...

对于这么小的数据集,很容易对排列进行硬编码:

s --> r,g,b ; r,b,g ; g,r,b ; b,r,g ; g,b,r ; b,g,r.
r --> [red].
g --> [green].
b --> [blue].

【讨论】:

以上是关于使用 DCG 编写简单的“消除过程”Prolog 代码的主要内容,如果未能解决你的问题,请参考以下文章

Prolog DCG从字母数字字符构建/识别单词串

Prolog DCG 使用 separotr 从文件中读取

通过 DCG 在 Prolog 中的镜头,可能与否?

如何在没有 DCG 的 L 系统启发的重写系统中进行递归

如何在DCG之后从知识库中生成一些短语?

Prolog 中是不是可以进行自适应解析?