2015-09-15 40 views
2

我有以下形式的數據:構建從結構數據的邏輯表達式ClpB的

:-use_module(library(clpb)). 
%inputs are ids that will have an associated boolean value. 
input(i1). 
input(i2). 
input(i3). 
input(i4). 
input(i5). 
input(i6). 
input(i7). 
input(i8). 
input(i9). 
input(i10). 
input(i11). 
input(i12). 
input(i13). 
input(i14). 
input(i15). 
input(i16). 
input(i17). 
input(i18). 
input(i19). 
input(i20). 
input(i21). 
input(i22). 
input(i23). 

%and_gate(Id,ListOfInputs) the list of inputs can include other AND and/or OR gates 

and_gate(and1,[i1,i2,i3]). 
and_gate(and2,[i4,i5,i6]). 
and_gate(and3,[and1,and2,or1,or2,i7,i8]). 
and_gate(and4,[or3,i9]). 
and_gate(and5,[i15,i16,i17]). 

%or_gate(Id,ListOfInputs) the list of inputs can include inputs as well as AND and/or OR gates 
or_gate(or1,[i10,i11]). 
or_gate(or2,[i12,i13]). 
or_gate(or3,[or2,i14]). 
or_gate(or4,[and5,i18,i19,i20]). 

%device(ID,ListOfInputs) the list of inputs can include inputs as well as AND and/or OR gates 
device(d1, [and3,and4,or3,or4]). 
device(d2,[i21,i22,i23]). 

圖:https://docs.google.com/drawings/d/10wBpmFxxbDqrlpPVqpkVo_r8I-qcalWAz7Lro9myjMs/edit?usp=sharing

輸入到裝置中,也像一個與門,但它們總是'電路樹的頂層'級別。 我想要實現一個謂詞,會導致類似:

?- device_structure(D,OnOFF,Sat,Inputs). 
D=d1, 
Sat = sat(OnOff =:= *([*([*([V1,V2,V3]), 
          *([V4,V5,V6]),V7,V8,+[V10,V11],+[V12,V13] 
         ]), 
         *([V9,+[V14,+[V12,V13]]]), 
         +[V14,+[V12,V13]], 
         +[*([V15,V16,V17]),V18,V19,V20]])), 

Inputs =  [ 
     input(i1,V1), 
     input(i2,V2), 
     input(i3,V3), 
     input(i4,V4), 
     input(i5,V5), 
     input(i6,V6), 
     input(i7,V7), 
     input(i8,V8), 
     input(i9,V9), 
     input(i10,V10), 
     input(i11,V11), 
     input(i12,V12), 
     input(i13,V13), 
     input(i14,V14), 
     input(i15,V15), 
     input(i16,V16), 
     input(i17,V17), 
     input(i18,V18), 
     input(i19,V19), 
     input(i20,V20) 
    ]). 

然後當然更簡單的結構d2

這將允許我使用clpb庫來實例化輸入,以瞭解哪些設備處於打開或關閉狀態,或者找到需要打開的設備的輸入。

然而,儘管多次嘗試,我還是無法正確構建這些結構。

V變量不需要像這樣命名,但重要的是,sat語句中的變量與正確的輸入變量相匹配。

+2

請嘗試獲取單個示例權限的語法,以便我們可以更好地理解您正在執行的操作。例如,也許這更接近你想表達的內容:'sat(OnOff =:* *([*([V1,V2,V3]),*([V4,V5,V6]),V7,V8, + [V10,V11],+ [V12,V13],+ [V9,+ [+ [V12,V13],V14]],+ [+ [V12,V13],V14] V16,V17]),V18,V19,V20]]))。'。請注意,我可以省略幾個括號:'+'是一個具有正確優先級的前綴運算符,所以我可以簡單地寫'+ [A,B,C]'而不是'+([A,B,C])'都表示與「A + B + C」完全相同。 '*([A,B,C])''必須保留外部括號。 – mat

+0

當我用CLP(B)嘗試上面的內容時,我從剩餘目標中看到,順便提一下,公式的真值與「V9」和「V14」無關,所以這可以幫助縮短表達式。要將原子與變量相關聯,您可以簡單地使用Atom-Variable對:使用'pairs_keys_values(Pairs,Keys,Values)'在'Keys'中爲每個'Key'引入一個新變量,並且可以使用'list_to_assoc/2'構建一個關聯表,以便更快速地查找與鍵對應的變量。 – mat

+0

我編輯了我認爲應該是的表達式(感謝提示或+ [])。我也插入了一個圖表(所以你可以看到我的工作)。關鍵是要從給定的數據中自動構建這個公式,所以我們不需要爭搶我們的大腦,試圖手動編寫它們!謂詞需要返回一個輸入列表(id,Var),所以我不知道我是否使用'pairs'獲得了一些東西。 – user27815

回答

2

這似乎工作,HTH

device_structure(D, OnOFF, Sat, Inputs) :- 
    device(D, D_in), 
    build(D_in, Structure, Inputs), 
    Sat = sat(OnOFF =:= *(Structure)). 

build([], [], []). 
build([C|Cs], [V|R], Inputs) :- 
    input(C), 
    build(Cs, R, InputsR), 
    inputs([C-V], InputsR, Inputs). 
build([C|Cs], [+(OrStruct)|R], Inputs) :- 
    or_gate(C, OrInputs), 
    build(OrInputs, OrStruct, Inputs1), 
    build(Cs, R, Inputs2), 
    inputs(Inputs1, Inputs2, Inputs). 
build([C|Cs], [*(AndStruct)|R], Inputs) :- 
    and_gate(C, AndInputs), 
    build(AndInputs, AndStruct, Inputs1), 
    build(Cs, R, Inputs2), 
    inputs(Inputs1, Inputs2, Inputs). 

inputs(I1, I2, Inputs) :- 
    append(I1, I2, I3), 
    sort(I3, Inputs). 

輸入像[I1-_Var1,...],得到變量,你可以使用pairs_keys_values(InputPairs,_,輸入)。

+0

太棒了! HTH是什麼意思? – user27815

+0

希望這有助於:) – CapelliC