受早期问题的启发,我尝试实现一些可以枚举布尔表达式的可能性的东西。但是,我在选择变量时遇到了麻烦。这是我的预期结果:
?- eval(X^Y, R).
R = 0^0;
R = 0^1;
R = 1^0;
R = 1^1;
no.
这是我的代码:
:- op(200, yfx, ^).
split(V, R) :- var(V), R = 0.
split(V, R) :- var(V), R = 1.
split(X ^ Y, XP ^ YP) :- split(X, XP), split(Y, YP).
即使对于这个简单的案例,这也不能满足我的要求:
?- split(Y, R).
R = 0 ;
R = 1 ;
Y = _G269^_G270,
R = 0^0 ;
Y = _G269^_G270,
R = 0^1 ;
Y = _G269^ (_G275^_G276),
R = 0^ (0^0) ;
Y = _G269^ (_G275^_G276),
R = 0^ (0^1) ;
Y = _G269^ (_G275^ (_G281^_G282)),
R = 0^ (0^ (0^0)) .
所以,我可以看到问题出在哪里,即在通过split(Y, YP)
Prolog 的过程中已经用尽了前两个子句,所以它再次结束,基本上split(X^Y, ...)
统一了 myY
和。X'^Y'
我只是不确定我需要做什么来关闭这条路径,除非我一开始就有结构^/2
。
我也希望它可以与嵌套结构一起使用,所以我不能仅仅消除分支的递归处理。
编辑:没有运营商
如果op/3
困扰您,请考虑以下公式:
eval(and(X,Y), R).
R = and(0,0);
R = and(0,1);
R = and(1,0);
R = and(1,1);
no.
这将是这种情况下的代码:
split(V, R) :- var(V), R = 0.
split(V, R) :- var(V), R = 1.
split(and(X,Y), and(XP,YP)) :- split(X, XP), split(Y, YP).
请记住,我仍然希望它可以与诸如此类的递归公式一起使用and(and(X,Y),and(Y,Z))
。