我有以下形式的数据:
:-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]).图表: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语句中的变量与正确的输入变量匹配是很重要的。
发布于 2015-09-15 17:22:28
这似乎很管用,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,_,Input)获取变量。
https://stackoverflow.com/questions/32586326
复制相似问题