Logic 解决命题逻辑/布尔表达式的工具(SAT解算器?)
我对命题逻辑和布尔表达式的主题是陌生的。这就是我需要帮助的原因。我的问题是: 在汽车行业,当你买一辆汽车时,你可以选择上千种不同的部件。并非每个组件都是可组合的,因此对于每辆车,都存在许多用命题逻辑表示的规则。就我而言,每辆车都有2000到4000条规则 它们看起来像这样: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表中的零部件。我的数据由成对的组件及其链接变量组成 例
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