写一个简单的"消除过程"使用DCG的Prolog代码

时间:2014-12-01 20:41:43

标签: prolog dcg zebra-puzzle

我简化了一个更为复杂的问题:街道上有三栋不同颜色的房屋(没有重复的颜色);红色,蓝色,绿色。使用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].

2 个答案:

答案 0 :(得分:2)

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).

答案 1 :(得分: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].