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