虽然学习Prolog的解决CNF,我试着写一个程序解决CNF问题(性能不是问题),所以我结束了下面的代码来解决(!x||y||!z)&&(x||!y||z)&&(x||y||z)&&(!x||!y||z)
:使用Prolog的
vx(t).
vx(f).
vy(t).
vy(f).
vz(t).
vz(f).
x(X) :- X=t; \+ X=f.
y(Y) :- Y=t; \+ Y=f.
z(Z) :- Z=t; \+ Z=f.
nx(X) :- X=f; \+ X=t.
ny(Y) :- Y=f; \+ Y=t.
nz(Z) :- Z=f; \+ Z=t.
cnf :-
(nx(X); y(Y); nz(Z)),
(x(X); ny(Y); z(Z)),
(x(X); y(Y); z(Z)),
(nx(X); ny(Y); z(Z)),
write(X), write(Y), write(Z).
有使用这种说明性语言解决CNF的更简单,更直接的方法?
我用的是GNU Prolog的1.3,当我运行的代码(定义MAPLIST谓语之后),我得到一些例外。它是否在其他编译器上运行? – banx 2011-02-27 02:14:01
添加规则“false: - 失败。”如果你的系统还不支持false/0。 GNU Prolog(1.4),YAP和SWI的最新开发版本都拥有它,等等。 – mat 2011-02-28 09:53:03
OP在我的回答后改变了问题,它真实地翻译了原始问题;-) – mat 2015-11-12 18:54:24