Package: localc
Localc (Logic Calculator)介绍一个简单的逻辑计算器。能进行逻辑表达式（即命题Proposition）的求解运算。安装方法本项目已上传至PYPI，直接利用pip（Python的包管理器即可安装）。只需在控制台输入如下命令：pip install localc即可安装最新版本的localc。文档快速开始localc是一个小巧的逻辑计算器，使用起来非常简单。安装完成后，直接在控制台使用：python -m localc即可打开下面的用户界面：Localc (Logic Calculator), Version 1.2.3
In [1]:你可以直接使用以下构造函数：Proposition("true and false")这样会生成一个命题实例，其中的字符串描述了这个命题。你可以计算这个命题的值，只需要使用：p=Proposition("true and false")print(p.calc())或者更简便地，利用命题对象的value属性：print(Proposition("true and false").value)得到的结果均为False，当然，这是因为“真 与 假”这个命题的结果为假更特别地，你可以使用变量名来表示子命题，如：p=Proposition("x and not y or z")其中的x，y，z都是变量名，表示了一个子命题。注意，此时计算命题p的值，会引发异常。因为其子命题x，y，z的值均未确定。不过，你却可以打印出基于这三个变量的真值表，只需要使用命题对象的table属性：p=Proposition("x and not y or z")print(p.table)你就会得到如下输出：+-------+-------+-------+-------+----------+----------------+
|  [x]  |  [y]  |  [z]  |  ¬[y] | [x]∧¬[y] | [x]∧¬[y] ∨ [z] |
+-------+-------+-------+-------+----------+----------------+
| False | False | False |  True |  False   |     False      |
| False | False |  True |  True |  False   |      True      |
| False |  True | False | False |  False   |     False      |
| False |  True |  True | False |  False   |      True      |
|  True | False | False |  True |   True   |      True      |
|  True | False |  True |  True |   True   |      True      |
|  True |  True | False | False |  False   |     False      |
|  True |  True |  True | False |  False   |      True      |
+-------+-------+-------+-------+----------+----------------+这展示了真值表以及原命题的计算过程。另外，你还可以指定一个变量的值。只需要使用variable:value的语法。例如，在上例中，将z变量的值赋值为true，其余均不变，则使用：p=Proposition("x and not y or z:true")print(p.table)则会得到z列恒为True的真值表+-------+-------+------+-------+----------+----------------+
|  [x]  |  [y]  | [z]  |  ¬[y] | [x]∧¬[y] | [x]∧¬[y] ∨ [z] |
+-------+-------+------+-------+----------+----------------+
| False | False | True |  True |  False   |      True      |
| False |  True | True | False |  False   |      True      |
|  True | False | True |  True |   True   |      True      |
|  True |  True | True | False |  False   |      True      |
+-------+-------+------+-------+----------+----------------+最后，直接打印命题，可以得到用于计算该命题的树状结构。例如：p=Proposition("(true and x) and not y or z:true")print(p)会得到以下树状结构：OR
├─── AND
│    ├─── GROUP
│    │    └─── AND
│    │         ├─── True
│    │         └─── [ x ]
│    └─── NOT
│         └─── [ y ]
└─── [ z -> True ]更多命名空间与项目结构想要使用localc，就必须导入localc包。localc包中包含了如下组件：node，包含了用于存储抽象语法树的数据结构operators，用于操作符英语与数学表示的相互转换parser，利用token流，构建抽象语法树proposition，主用户接口scanner，任务是生成token流我并不建议你使用除了proposition以外的其他包，除非你知道自己在做什么。对于大多数用户而言，你只需要在Python代码文件的头部加上：fromlocalcimportProposition命题使用localc计算器的核心是命题。命题是这样的字符串，它包含了：逻辑运算符表示子命题的变量名用于修改运算符优先级顺序的圆括号逻辑运算符为了方便输入，逻辑运算符都是用英文单词表示的。目前可用的逻辑运算符（按照优先级从低到高排列）有：优先级运算符描述1iff当且仅当（If and Only If）2if每当（If）3oif仅当（Only If）4xor异或5or逻辑或6and逻辑与7not逻辑非8(some_expression)分组变量名变量名是用于表示子命题的单词，它可以包含任意的数字，字母，特殊符号，且遵循特定的规则。其规则是：变量名不能以左圆括号(开头变量名不能以右圆括号)结尾变量名不能含有冒号:例如，下面的变量名都是合法的：p、a_proposition、!%@#&$^(以下变量名则是非法的，因为他们违反了上面的规则：(left、right)、abc:def变量名赋值通过variable:value的语法，可以给子命题赋值。其中value可以是：true，表示该子命题为真false，表示该子命题为假展示命题新建Proposition命题对象后，可以直接打印该命题对象：print(Proposition("true and false"))会生成该命题对应的树状结构：AND
├─── True
└─── False注意，该树状结构可以任意复杂，如：p=Proposition("true and x:true or (y:false and not z)")print(p)会得到：OR
├─── AND
│    ├─── True
│    └─── [ x -> True ]
└─── GROUP
     └─── AND
          ├─── [ y -> False ]
          └─── NOT
               └─── [ z ]或者，使用内置的repr函数，获得可用于重建该命题的字符串（只需再利用eval）函数：p=Proposition("true and false")print(repr(p))最后输出可直接用于eval函数的字符串：Proposition("true and false")生成真值表直接打印命题的table属性，就可以得到该命题对应的真值表，如：p=Proposition("w and x and (y or not z)")print(p.table)将生成：+-------+-------+-------+-------+-------+---------+------------+--------------+----------------------+
|  [w]  |  [x]  |  [y]  |  [z]  |  ¬[z] | [w]∧[x] | [y] ∨ ¬[z] | ([y] ∨ ¬[z]) | [w]∧[x]∧([y] ∨ ¬[z]) |
+-------+-------+-------+-------+-------+---------+------------+--------------+----------------------+
| False | False | False | False |  True |  False  |    True    |     True     |        False         |
| False | False | False |  True | False |  False  |   False    |    False     |        False         |
| False | False |  True | False |  True |  False  |    True    |     True     |        False         |
| False | False |  True |  True | False |  False  |    True    |     True     |        False         |
| False |  True | False | False |  True |  False  |    True    |     True     |        False         |
| False |  True | False |  True | False |  False  |   False    |    False     |        False         |
| False |  True |  True | False |  True |  False  |    True    |     True     |        False         |
| False |  True |  True |  True | False |  False  |    True    |     True     |        False         |
|  True | False | False | False |  True |  False  |    True    |     True     |        False         |
|  True | False | False |  True | False |  False  |   False    |    False     |        False         |
|  True | False |  True | False |  True |  False  |    True    |     True     |        False         |
|  True | False |  True |  True | False |  False  |    True    |     True     |        False         |
|  True |  True | False | False |  True |   True  |    True    |     True     |         True         |
|  True |  True | False |  True | False |   True  |   False    |    False     |        False         |
|  True |  True |  True | False |  True |   True  |    True    |     True     |         True         |
|  True |  True |  True |  True | False |   True  |    True    |     True     |         True         |
+-------+-------+-------+-------+-------+---------+------------+--------------+----------------------+计算命题命题的值存储在Proposition对象的value属性中。若该命题中所有子命题都有值，或没有其他子命题，则该命题可以计算。若该命题可以计算，则命题的值已经在创建该命题的时候提前算出；若该命题不能计算，则value属性的值为None。特别地，如果你需要重算命题的值，可使用calc方法。调用calc方法后，value属性也会相应更新。例如：p=Proposition("true and not false")print(p.calc())你将得到：True修改命题修改命题是指，改变命题中的标识符对应的值。当然，最简单的方法是新建一个全新的命题，并在命题描述语句中给这些命题的标识符赋值。否则，你可能需要以下知识：为了得到命题中标识符节点的引用，你可以使用identifiers属性（一个记录了所有标识符对象引用的列表），或unspecified属性（一个记录了所有未赋值标识符引用的列表），并修改这些节点的value属性。另外，标识符的name属性记录了该标识符的名称。这在赋值的时候很有用。最后，当你通过这种方式修改命题后，请务必调用命题对象的init方法：p=Proposition("a and b and not c")print("Original proposition:")print(p,'\n')print("Modifying proposition...")values={"a":True,"b":True,"c":False}foridentifierinp.identifiers:identifier.value=values[identifier.name]p.init()print("After modifying:")print(p)print("With a value of{}".format(p.value))你会得到：Original proposition:
AND
├─── AND
│    ├─── [ a ]
│    └─── [ b ]
└─── NOT
     └─── [ c ]

Modifying proposition...
After modifying:
AND
├─── AND
│    ├─── [ a -> True ]
│    └─── [ b -> True ]
└─── NOT
     └─── [ c -> False ]
With a value of True其他由于这只是个简单的小项目，若你还需要更多功能和自由度，欢迎阅读该项目的源代码，或者提出Issue。