python中的命题演算

时间:2011-08-18 09:14:57

标签: python math logic calculus

我正在寻找一个在python中运行的命题演算模块。

我的用户需要在文本区域输入公式,然后我必须检查它是否正确。

我无法直接测试输入文本是否等于正确的输入文本,因为它没有考虑排列或这些事情。

这样的模块是否存在?

- 编辑 -

以下是该项目的截图(设计未完成):

enter image description here

3 个答案:

答案 0 :(得分:1)

这不太难。您需要做的就是(a)找到或(b)编写一个接受任意命题并生成真值表的实用程序。然后,对于两个命题,您需要做的就是生成两个真值表并检查原子变量和最后一列是否在所有行中匹配。

这是原子变量数量的O(2 ^ n),并假设每个命题包含相同数量的原子变量。如果可能包含额外无用的原子变量(如OR(b或NOT b)等效于a),则需要填充更简单命题的真值表以获得相同数量的行。如果允许使用不同的原子变量,则会变得更加困难。

假设P!= NP,你不能做得比O(2 ^ n)好,因为多项式解可以解决命题演算的一般可满足性问题。

要生成真值表,您需要(a)生成原子变量真值的所有2 ^ n排列列表(许多方法),以及(b)评估仲裁赋值的命题原子变量的真值。然后只需制作两个表并进行比较。瞧!

答案 1 :(得分:1)

我刚刚偶然发现了这个问题。不知道是否需要回答,但我建议使用NumPy:

http://docs.sympy.org/dev/modules/logic.html

答案 2 :(得分:0)

A,B,C ...在您提供的示例中似乎是, 不是命题。这有可能是有道理的 关于这些类型的陈述,但不是 命题逻辑,据我所见。

在语义上比较这些语句,这是什么 你想要这里,需要一个更复杂的逻辑, 但更简单的方法可能是重写 通过明文可比较的所有表格陈述 比较。即通过忽略交换性,这个 声明

 (A ⋃ B) ⋂ C

与此声明相同

 C ⋂ (B ⋃ A)

即使这不是一个完美的设置,因为可能 是等同于未被承认的陈述, 使用逻辑等价来解决这个问题的过程 要困难得多。使用重写逻辑或多或少 你想要的只需要很少的努力。基本上都是你 需要指定哪个是二进制运算符 交换。一些重写等价的方程式 还添加了语句,您可能需要添加更多... 我在Maude http://maude.cs.uiuc.edu/

中写了一些东西
    mod VennDiagram is

    --- sorts
    sort Set .
    sort Statement .
    subsort Set < Statement .

    --- propositional formulas
    op a : -> Set .
    op b : -> Set .
    op c : -> Set .
    op d : -> Set .
    op e : -> Set .
    op f : -> Set .
    op g : -> Set .
    op h : -> Set .
    op i : -> Set .
    op j : -> Set .
    --- and so on ....

    --- connectives
    op ¬_  : Statement -> Statement .
    op _∁  : Statement -> Statement . --- complement
    op _∨_ : Statement Statement -> Statement [ comm ] .
    op _∧_ : Statement Statement -> Statement [ comm ] .
    op _↔_ : Statement Statement -> Statement [ comm ] .
    op _→_ : Statement Statement -> Statement .
    op _⋂_ : Statement Statement -> Statement [ comm ] .
    op _⋃_ : Statement Statement -> Statement [ comm ] .
    op _←_ : Statement Statement -> Statement .


    vars S1 S2 S3 S4 : Statement . --- variables

    --- simplify statemens through equivalence

    eq S1 → S2 = ¬ S1 ∨ S2 .
    eq S1 ↔ S2 = (S1 → S2) ∧ (S2 → S1) .
    eq ¬ ¬ S1 = S1 .
    eq S1 ← S2 = S2 → S1 .
    eq ¬ ( S1 ∧ S2 ) = (¬ S1) ∨ (¬ S2) .
    --- possibly other equivalences as well..

    endm

    --- check equality

    reduce a ↔ b == (b → a) ∧ (a → b) .
    reduce ¬ a ↔ ( a ∨ b ) ==  ¬ a ↔ ( b ∨ a ) .
    reduce (a ⋃ b) ⋂ c == c ⋂ (b ⋃ a) .

    --- what you need to do is to compare the right answer
    --- with a student answer through a simple comparison..
    --- reduce StudentAnswer == RightAnswer