2012-12-05 33 views
0

我試着編寫一個謂詞,返回謂詞的所有令人滿意的組合。 例如... val_form(F,L1,L2)作爲F是謂詞,L1是其變量的列表,L2是輸出。滿足公式值PROLOG

例如:

val_form(q & (r -> p),[p,q,r],L2). 

序言應返回:

L2=[0, 1, 0], L2=[1, 1, 0] e L2=[1,1,1] 

一個鍵入 「;」 結果之間。

我已經定義了運算符「 - >」,「&」及其結果爲「0」和「1」的情況。如果找不到任何有效的解決方案,則返回False。

+0

一個會生成和測試方法是令人滿意的? – hardmath

+0

你可以包含' - >/2'和'&/ 2'的代碼嗎? –

回答

0

我一旦適應有關Truth table maker J.R.Fischer教程頁面,解釋非常相似的任務,你所需要的。除了含義之外,我使用了不同的運算符,它非常適合( - >)/ 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.