0

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

4

2 回答 2

0

尝试为此使用 findall 谓词

于 2013-02-14T14:10:52.700 回答
0

我曾经改编过关于真值表制造商的JRFischer 教程页面,它解释了与您需要的任务非常相似的任务。我使用了不同的运算符,除了含义之外,它们非常适合 (->)/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.
于 2013-02-14T17:14:22.793 回答