拆分声明可以拖欠

时间:2016-12-20 18:12:28

标签: prolog

所以我做了一个Prolog程序,它接受任意数量的参数,如A B C和一个语句,并打印其真值表。
如果我想单独拆分每个语句并显示其真值表怎么办? 例如和(或(A,B)和(A,B)) 所以它应该显示

A  B  or(A,B) and(A,B)  full equation      
T   T     T     T           T             
T  F      T     F           T

我注意到方法split_string但我不知道如何在我的情况下使用它 这是我的代码:

table(VarList,Expr) :- bindList(VarList), do(VarList,Expr), fail.

bind(true).
bind(false).

bindList([]).

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

do(VarList,Expr) :- writeVarList(VarList), writeExpr(Expr), nl.

writeVarList([]).
writeVarList([V|Vs]) :- write(V), write('  '), writeVarList(Vs).

writeExpr(Expr) :- Expr, !, write(true).
writeExpr(_) :- write(false).

1 个答案:

答案 0 :(得分:1)

如果您希望能够单独评估子表达式,则需要编写代码来计算这些子表达式。有一种简单的方法可以通过回溯来实现,尽管这里的列表似乎更合适。这是一个计算所有andor子表达式的DCG,但不包括变量叶:

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)].

有了这个列表,你可以绑定变量并使用maplist/2逐个评估子表达式,如果你的Prolog有它:

?- phrase(subexprs(and(or(A, B), and(A, B))), Subexprs), bindlist([A,B]), maplist(write_expr, Subexprs), nl.
 true true true
A = B, B = true,
Subexprs = [or(true, true), and(true, true), and(or(true, true), and(true, true))] ;
 true false false
A = true,
B = false,
Subexprs = [or(true, false), and(true, false), and(or(true, false), and(true, false))] ;
 true false false
A = false,
B = true,
Subexprs = [or(false, true), and(false, true), and(or(false, true), and(false, true))] ;
 false false false
A = B, B = false,
Subexprs = [or(false, false), and(false, false), and(or(false, false), and(false, false))].

请注意,使用write的输出位于答案替换之前。使用这样的谓词将表达式的评估与打印结果分开会更清晰:

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

这给出了:

?- phrase(subexprs(and(or(A, B), and(A, B))), Subexprs), bindlist([A,B]), maplist(expr_value, Subexprs, Values).
A = B, B = true,
Subexprs = [or(true, true), and(true, true), and(or(true, true), and(true, true))],
Values = [true, true, true] ;
A = true,
B = false,
Subexprs = [or(true, false), and(true, false), and(or(true, false), and(true, false))],
Values = [true, false, false] ;
A = false,
B = true,
Subexprs = [or(false, true), and(false, true), and(or(false, true), and(false, true))],
Values = [true, false, false] ;
A = B, B = false,
Subexprs = [or(false, false), and(false, false), and(or(false, false), and(false, false))],
Values = [false, false, false].

然后,您可以使用Values列表打印子表达式的值,方法与打印变量值的方式相同。