灵感来自之前的一个问题 https://stackoverflow.com/questions/41595786/using-operator-to-save-variables-in-a-list我尝试实现一些可以枚举布尔表达式可能性的东西。但是,我在变量选择方面遇到了麻烦。这是我的预期结果:
?- 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, ...)
再次统一我的Y
with X'^Y'
, 本质上。我只是不确定我需要做什么来关闭这条路径,除了一开始我就有结构^/2
.
我还希望它能够与嵌套结构一起使用,所以我不能仅仅消除分支的递归处理。
Edit: 没有运算符
If the 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))
etc.