我是一个全新的sat4j解决方案..
它说某些cnf文件应该作为输入
是否有任何可能的方法将规则作为输入并获得它是否可满足?
我的规则将是那种:
Problem = (
( staff_1 <=> staff_2 ) AND
( doctor_1 <=> physician_2 )
) AND (
( staff_1 AND doctor_1 )
) AND (
NOT( ward_2 AND physician_2 ) AND
NOT( clinic_2 AND physician_2 ) AND
NOT( admission_record_2 AND physician_2 )
) AND (
NOT( hospital_2 AND physician_2 ) AND
NOT( department_2 AND physician_2 ) AND
NOT( staff_2 AND physician_2 )
)
有人可以帮我解决这个问题吗?使用sat4j求解器?
答案 0 :(得分:5)
如果您想使用SAT4J,则需要转换问题CNF格式。
首先需要将这些文本变量转换为整数。
1 = staff_1
2 = staff_2
3 = doctor_1
4 = physician_2
5 = ward_2
6 = clinic_2
7 = admission_record_2
8 = hospital_2
9 = department_2
然后,以下是将问题转换为CNF格式时需要了解的规则和语法。
Syntax:
OR = a space
AND = a newline
NOT = -
Rules from De Morgan's laws:
A <=> B = (A => B) AND (B => A)
A => B = NOT(A) OR B
NOT(A AND B) = NOT(A) OR NOT(B)
NOT(A OR B) = NOT(A) AND NOT(B)
这是你的示例问题,格式化应该由SAT4J读取。
(请参阅DIMACS了解有关此格式的更多信息)。
c you can put comment here.
c Formatted by StackOverFlow.
p cnf 9 12
-1 2 0
-2 1 0
-3 4 0
-4 3 0
1 0
3 0
-5 -4 0
-6 -4 0
-7 -4 0
-8 -4 0
-9 -4 0
-2 -4 0
我让你在这个小例子上运行SAT4J,
它将为您提供解决方案SATISFIABLE
xor UNSATISFIABLE
。
对使用SAT4J所要做的事情的总结很少:
* Transform your `text_n` into a number.
* Use the rule that I gave you to transform your problem into CNF.
* Write the definition of your problem `p cnf nbVariables nbClauses`
* Write everything in a FILE and run SAT4J on this file.
我希望这个循序渐进的例子能帮助很少的人。
答案 1 :(得分:2)
我正在寻找一个如何使用SAT4J的例子,并找到了这个已有6年历史的话题。
我认为Valentin Montmirail的回答是不正确的,因为提供的链接 (DIMACS)说:
子句的定义以最终值“0”结束。
因此,我认为正确的答案是:
c you can put comment here.
c Formatted by StackOverFlow.
p cnf 9 12
-1 2 0
-2 1 0
-3 4 0
-4 3 0
1 0
3 0
-5 -4 0
-6 -4 0
-7 -4 0
-8 -4 0
-9 -4 0
-2 -4 0
我失去了30分钟,我希望它能帮助未来的读者。
答案 2 :(得分:0)
您是否在他们的网站上查看了SAT4J Howto?它包含一个Postscript document的链接,详细说明了CNF格式的语义。该格式似乎支持您在示例中使用的所有运算符,但“&lt; - &gt;”除外,但这可能是此特定“非官方”文档中的遗漏。