所以我做了一个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).
答案 0 :(得分:1)
如果您希望能够单独评估子表达式,则需要编写代码来计算这些子表达式。有一种简单的方法可以通过回溯来实现,尽管这里的列表似乎更合适。这是一个计算所有and
和or
子表达式的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
列表打印子表达式的值,方法与打印变量值的方式相同。