我把一个更复杂的问题简化为:一条街上有三栋房子,有三种不同的颜色(没有重复的颜色(;红色,蓝色,绿色。使用 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].
s/Col/col/
然后,您将在 Prolog 目标内使用s//0
而不是非终端。那行不通,你需要用这样的{}//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).
您(也(忘记从叶子中"返回"值:
...
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].