【问题标题】:Building a logical expression from structure data for clpb从结构数据为 clpb 构建逻辑表达式
【发布时间】:2015-09-15 12:38:49
【问题描述】:

我有以下形式的数据:

:-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 语句中的变量与正确的输入变量匹配。

【问题讨论】:

  • 请尝试正确获取单个示例的语法,以便我们更好地了解您在做什么。例如,也许这更接近您想要表达的内容:sat(OnOff =:= *([ *([V1,V2,V3]), *([V4,V5,V6]),V7,V8,+[V10,V11],+[V12,V13],+[V9,+[+[V12,V13],V14]], +[+[V12,V13],V14], +[*([V15,V16,V17]),V18,V19,V20]])).。请注意,我可以省略几个括号:+ 是具有正确优先级的前缀运算符,因此我可以简单地写为+[A,B,C] 而不是+([A,B,C]),两者都表示与A+B+C 完全相同。不过,连词 *([A,B,C]) 必须保留外括号。
  • 当我用 CLP(B) 尝试上述方法时,我从残差目标中看到公式的真值与V9V14 无关,所以这可以提供帮助来缩短表达式。要将原子与变量关联,您可以简单地使用Atom-Variable 对:使用pairs_keys_values(Pairs, Keys, Values)Keys 中的每个Key 引入一个新变量,您可以使用list_to_assoc/2 构建关联表以便更快地查找键对应的变量。
  • 我已将表达式编辑为我认为应该的样子。(感谢您的提示或 +[])。我还插入了一个图表。(所以你可以看到我的工作)。关键是根据给定的数据自动构建这个公式,所以我们不必绞尽脑汁尝试手动编写它们!谓词需要返回一个 input(id,Var) 列表,所以我不知道我是否使用 'pairs' 获得了一些东西。
  • 我觉得只有v14是独立的?
  • 在您的编辑中,您将+ 更改为*,所以是的,在当前版本中,只有V14 是独立的。

标签: prolog clpb


【解决方案1】:

这似乎有效,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, _, Inputs)。

【讨论】:

  • 太棒了! HTH 是什么意思?
猜你喜欢
  • 2015-04-01
  • 1970-01-01
  • 2014-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-02
  • 1970-01-01
  • 2021-01-15
相关资源
最近更新 更多