使用 DCG 编写简单的 "process of elimination" Prolog 代码



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

相关内容

  • 没有找到相关文章

最新更新