如何使用子表达式

时间:2016-12-26 20:41:18

标签: prolog

Hello stackoverflow社区, 我有一个prolog代码,为真值表创建子表达式,然后给它们值true / false 以及它对很多表达式的工作正常但是使用这个语句会发生这种情况

1 ?- phrase(subexprs(bicond(and(impl(A,B),impl(B,A)),bicond(A,B))),Subexprs), bindList([A,B]), maplist(expr_value, Subexprs, Values).
A = B, B = true,
Subexprs = [true impl true, true impl true,  (true impl true)and(true impl true), true bicond true,  **(true impl true)and(true impl true)bicond(true bicond true)**],
Values = [true, true, true, true, false] .

最后一个值不是应该打印的 应该打印整个表达式而不是 bicond((true impl true)和(true impl true),bicond true)

这是我的代码

and(A,B) :- A, B.
or(A,_) :- A.
or(_,B) :- B.
equ(A,B) :- or(and(A,B), and(not(A),not(B))).
xor(A,B) :- not(equ(A,B)).
nor(A,B) :- not(or(A,B)).
nand(A,B) :- not(and(A,B)).
impl(A,B) :- or(not(A),B).
bicond(true,true):-true.
bicond(true,false):-false.
bicond(false,true):-false.
bicond(false,false):-true.


:- op(900, fy,not).
:- op(910, yfx, and).
:- op(910, yfx, nand).
:- op(920, yfx, or).
:- op(920, yfx, nor).
:- op(930, yfx, impl).
:- op(930, yfx, equ).
:- op(930, yfx, xor).
:- op(910, yfx, bicond).


subexprs(V) -->
    { var(V), ! },
    [].
subexprs(and(L, R)) -->
    subexprs(L),
    subexprs(R),
    [and(L, R)].
subexprs(or(L, R)) -->
    subexprs(L),
    subexprs(R),
    [or(L, R)].
subexprs(impl(L, R)) -->
    subexprs(L),
    subexprs(R),
    [impl(L, R)].
subexprs(nand(L, R)) -->
    subexprs(L),
    subexprs(R),
    [nand(L, R)].
subexprs(nor(L, R)) -->
    subexprs(L),
    subexprs(R),
    [nor(L, R)].
subexprs(xor(L, R)) -->
    subexprs(L),
    subexprs(R),
    [xor(L, R)].
subexprs(bicond(L, R)) -->
    subexprs(L),
    subexprs(R),
    [bicond(L, R)].


expr_value(Expr, true) :-
    call(Expr),
    !.
expr_value(_Expr, false).

bind(true).
bind(false).
bindList([]).
bindList([V|Vs]) :- bind(V),bindList(Vs).

我认为错误的部分是操作 但我不知道如何解决它

1 个答案:

答案 0 :(得分:0)

根据您当前对bicond/2的定义,调用bicond((true impl true)and(true impl true), bicond(true, true))将失败:bicond/2期望其每个参数与术语truefalse统一。但是你用复杂的术语来称它。

相反,您必须重写定义以“评估”其操作数术语,就像您在equ/2的定义中一样。