使用 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 代码的主要内容,如果未能解决你的问题,请参考以下文章