满足公式值PROLOG

时间:2012-12-05 20:23:40

标签: prolog

我尝试编写一个谓词,返回该谓词的所有令人满意的组合。 例如...... 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。

2 个答案:

答案 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.