Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Logic 解决命题逻辑/布尔表达式的工具(SAT解算器?)_Logic_Boolean Logic_Boolean Expression_Sat_Satisfiability - Fatal编程技术网

Logic 解决命题逻辑/布尔表达式的工具(SAT解算器?)

Logic 解决命题逻辑/布尔表达式的工具(SAT解算器?),logic,boolean-logic,boolean-expression,sat,satisfiability,Logic,Boolean Logic,Boolean Expression,Sat,Satisfiability,我对命题逻辑和布尔表达式的主题是陌生的。这就是我需要帮助的原因。我的问题是: 在汽车行业,当你买一辆汽车时,你可以选择上千种不同的部件。并非每个组件都是可组合的,因此对于每辆车,都存在许多用命题逻辑表示的规则。就我而言,每辆车都有2000到4000条规则 它们看起来像这样: A→ B∨ C∨ D C→ -F F∧ G→ D “在哪里”∧" = "及“/”∨" = "或“/”、“=”非“/”→" = "含义” 变量A,B,C。。。链接到BOM表中的零部件。我的数据由成对的组件及其链接变量组成 例

我对命题逻辑和布尔表达式的主题是陌生的。这就是我需要帮助的原因。我的问题是:

在汽车行业,当你买一辆汽车时,你可以选择上千种不同的部件。并非每个组件都是可组合的,因此对于每辆车,都存在许多用命题逻辑表示的规则。就我而言,每辆车都有2000到4000条规则

它们看起来像这样:

  • A→ B∨ C∨ D
  • C→ -F
  • F∧ G→ D
  • “在哪里”∧" = "及“/”∨" = "或“/”、“=”非“/”→" = "含义”

    变量A,B,C。。。链接到BOM表中的零部件。我的数据由成对的组件及其链接变量组成

    例如:

  • 第1部分,第2部分:(A)∧ (B)
  • 第1部分,第3部分:(A)∧ (C)∨ (F)
  • 组分_3,组分_5:(B)∨ (G)
  • 现在,我的问题是如何解决这个问题。具体来说,我想知道,根据上述规则,组件的每个组合是否都是可能的

  • 哪种工具、软件和算法可以解决这类问题
  • 有没有一个说明性的例子
  • 如何实现自动化,以便检查列表中的每个组合
  • 一般来说,我应该在谷歌搜索什么来加深我对这个主题的了解
  • 非常感谢你的帮助!
    Olaf

    您可能想尝试一个带有SAT解算器的Prolog系统,如SWI Prolog、Jekejeke Minlog等。。。您可以在Prolog系统的REPL中轻松地使用它。要加载SAT解算器,只需键入(您不需要键入?-本身):

    然后,您可以使用顶层搜索布尔公式的解,如本例中的xor:

    ?- sat(X#Y), labeling([X,Y]).
    X = 0,
    Y = 1 ;
    X = 1,
    Y = 0.
    
    下面是一个厨房规划器代码的示例。厨房有三个地方, 我们分配了一个冰箱和一个炉子。冰箱不允许靠近炉子

    冷冻柜的代码为0,1,炉子的代码为1,0。我们利用卡片约束来放置冰箱和炉子

    :- use_module(library(finite/clpb)).
    
    freezer([X,Y|L],[(~X)*Y|R]) :-
       freezer(L, R).
    freezer([], []).
    
    stove([X,Y|L],[X*(~Y)|R]) :-
       stove(L, R).
    stove([], []).
    
    free([X,Y|L],[(~X)*(~Y)|R]) :-
        free(L, R).
    free([], []).
    
    allowed([X,Y,Z,T|L]) :-
       sat(~((~X)*Y*Z*(~T))),
       sat(~(X*(~Y)*(~Z)*T)),
       allowed([Z,T|L]).
    allowed([_,_]).
    allowed([]).
    
    kitchen(L) :-
       freezer(L, F), card(1, F),
       stove(L, G), card(1, G),
       free(L, H), card(1, H),
       allowed(L).
    
    我想用Prolog代码演示的是它的好处,即针对SAT公式的问题编码可以通过Prolog代码本身来完成。当运行上述代码时,我得到了预期的以下结果:

    ?- L=[_,_,_,_,_,_], kitchen(L), labeling(L).
    L = [0,1,0,0,1,0] ;
    L = [1,0,0,0,0,1] ;
    No
    

    你可以看看过去的清单,选择一个工具来解决你自己的问题。imho,《满意度手册》是关于这个话题的最全面的介绍。对所有规则进行编码后,可以使用所谓的all sat搜索列出公式的所有可能模型,每个模型对应于特定的组件组合。要实现自动化,请使用一些脚本生成SAT公式。如果可能的话,在您的用例中尝试增量使用解算器,以获得更好的性能。好的,非常感谢。特别是“all sat”搜索可能会对我有所帮助。至于我推荐的all sat,我在这方面有着非常积极的经验,解决了一些现实问题。如果你想要更多的“表达力”,考虑使用
    ?- L=[_,_,_,_,_,_], kitchen(L), labeling(L).
    L = [0,1,0,0,1,0] ;
    L = [1,0,0,0,0,1] ;
    No