我尝试编写一个谓词,返回该谓词的所有令人满意的组合。
例如...... val_form(F,L1,L2)
,因为F是谓词,L1是变量列表,L2是输出。
例如:
val_form(q & (r -> p),[p,q,r],L2).
Prolog应该返回:
L2=[0, 1, 0], L2=[1, 1, 0] e L2=[1,1,1]
在结果之间输入“;”。
我已经定义了运算符“ - >”,“&”及其结果为“0”和“1”的情况。如果它找不到任何有效的解决方案,则返回False。
答案 0 :(得分:0)
尝试将findall谓词用于此
答案 1 :(得分:0)
我曾经修改了J.R.Fischer关于Truth table maker的教程页面,它解释了一个与你需要的非常相似的任务。我使用了不同的运算符,除了含义之外,它与( - >)/ 2很吻合。
formula(N,_,_,N) :-
member(N,[0,1]).
formula(X,Vars,A,Val) :-
atom(X),
lookup(X,Vars,A,Val).
formula(X + Y,Vars,A,Val) :-
formula(X,Vars,A,VX),
formula(Y,Vars,A,VY),
and(VX,VY,Val).
formula(X * Y,Vars,A,Val) :-
formula(X,Vars,A,VX),
formula(Y,Vars,A,VY),
or(VX,VY,Val).
formula(X -> Y,Vars,A,Val) :-
formula(X,Vars,A,VX),
formula(Y,Vars,A,VY),
imply(VX,VY,Val).
formula(- X,Vars,A,Val) :-
formula(X,Vars,A,VX),
not(VX,Val).
lookup(X,[X|_],[V|_],V).
lookup(X,[_|Vars],[_|A],V) :- lookup(X,Vars,A,V).
and(0,0,0).
and(1,1,1).
and(0,1,0).
and(1,0,0).
or(0,0,0).
or(0,1,1).
or(1,0,1).
or(1,1,1).
not(0,1).
not(1,0).
imply(0,0,1).
imply(0,1,1).
imply(1,0,0).
imply(1,1,1).
此代码比需要的更通用,要获得所需的赋值,我们必须约束调用:
?- lenght(A,3),formula(q + (r -> p), [p,q,r], A, 1).
Correct to: "length(A,3)"? yes
A = [0, 1, 0] ;
A = [1, 1, 0] ;
A = [1, 1, 1] ;
false.