一种听起来像这样的问题的方法是什么:
A说B谎言
B说C谎言
D说B谎言
C说B谎言
E说A和D谎言
有多少谎言和多少说实话? 我不是在寻找上述问题的答案,而是寻找解决这类问题的方法。非常感谢。
答案 0 :(得分:8)
A -> !B
B -> !C
D -> !B
C -> !B
E -> !A & !D
提醒:
X -> Y <=> !X | Y
将5个方程转换为逻辑命题,你会找到答案。
答案 1 :(得分:5)
解决形式的方程式
X 1 = NOT X 3
X 5 = NOT X 2
等
形成一个图形,其节点为X i 并连接X i 和X j iff等式X i = NOT X j 出现。
现在尝试使用广度优先搜索对图形进行双色处理。
答案 2 :(得分:4)
假设你想用一个程序解决这个问题......如果你有一个相当小的输入集,它实际上很容易暴力破解。例如,在这种情况下,你基本上有5个布尔变量 - 每个人是否都是真实的人。
将语句编码为测试,然后运行每个可能的组合以查看哪些是有效的。
这显然是一个“愚蠢”的解决方案,对于大型输入集将会失败,但它可能比完整的“推理”引擎更容易编码。我经常发现你可以通过考虑你实际遇到的问题大小来减少工作量。)
答案 3 :(得分:0)
使用Prolog等逻辑编程语言。它们专门用于解决此类问题。
其他替代方案包括功能逻辑语言和模型检查器。