相关文章推荐
另类的滑板  ·  Orson welles - ...·  1 年前    · 
坐怀不乱的椰子  ·  c++ - How can I use ...·  1 年前    · 
文武双全的足球  ·  Python游戏开发! ...·  1 年前    · 
from sympy import symbols, satisfiable, simplify_logic, true, false, And, Or, Not
from sympy.logic.boolalg import ANFform, truth_table, BooleanTrue, to_cnf, to_dnf
# Sum Of Production Form积和式, Production of Sum Form和积式
from sympy.logic import SOPform, POSform 
import numpy as np
from itertools import combinations
# 逻辑运算符:~否定,&合取,|析取,!=异或,>>蕴含,==等价
# 定义符号变量
p, q, r = symbols('p q r')
# 定义命题逻辑表达式
exp = (p | q >> r) >> p
# 用真值表法输出表达式的所有值
table = truth_table(exp, [p, q, r])
print('真值表')
print('p q r -> exp')
print('-' * 15)
for t in table:
    [pv, qv, rv], rst = t
    print(pv, qv, rv, '->', int(rst == true))
# 判断表达式的可满足性并求解
print('逻辑表达式可满足性判别并求解')
models = satisfiable(exp, all_models=True)
if models:
    rst = list(models)
    data = []
    varNames = []
    for dv in rst:
        if len(varNames) == 0:
            varNames = list(dv.keys())
        data.append([int(v) for v in list(dv.values())])
        #rst.append([dv[p], dv[q], dv[r]])
    print([ch for ch in varNames])
    print('-' * 15)
    data = np.array(data, int)    
    print(data)
# 获取表达式的合取范式和析取范式(非标准)    
# conjunctive normal form 和 disjunctive normal form
print('合取范式cnf=', simplify_logic(exp, 'cnf'))
print('析取范式dnf=', simplify_logic(exp, 'dnf'))
print('合取范式cnf=', to_cnf(exp))
print('析取范式dnf=', to_dnf(exp))
# 由随机真值表确定响应的真值函数——决策函数
# 动态定义4个变量——A,B,C,D
nVars = 4
vars = [chr(97 + i) for i in range(nVars)]
code = ','.join(vars) + " = symbols('" + ' '.join(vars) + "')"
print('code=', code)
exec(code)      #运行生成的代码code,以动态创建变量
# 生成变量的2 ** nVars个01的值组合
tbl = []
for i in range(2**nVars):
    bins = bin(i)[2:]
    bins = '0' * (nVars - len(bins)) + bins
    bins = [int(v) for v in bins]
    tbl.append(bins)
tbl = np.array(tbl, int)
# 随机生成y值表,并记录值为True的行号
yTrueIdx = [i for i, v in enumerate(np.random.randint(0, 2, (2 ** nVars))) if v == 1]
# 由真值表获得对应的赋值项
minterms = []
for rowno in yTrueIdx:
    minterms.append(list(tbl[rowno, :]))
print('最小项', minterms)
dontcares = []  #不关心项
# 取得由真值表所确定的真值决策函数表达式字符串
f1 = SOPform(vars, minterms, dontcares) #积和式
print('函数SOP形=', f1)
f2 = POSform(eval(','.join(vars)), minterms, dontcares) #积和式
print('函数POS形=', f2)
# 把变量名转换为数组索引
f3 = str(f1)
# 把f3中的个体变量名都更新为xs的数组下标表示
for i, var in enumerate(vars):
    f3 = f3.replace(vars[i], 'xs[%d]' % (i))
# 注意:由于sympy中的~逻辑运算在python中是位运算,故~-1=-2,导致不是严密的逻辑运算    
# 因此,需要把sympy中的逻辑运算符替换为python语言的逻辑运算符
f3 = f3.replace('~', ' not ')    
f3 = f3.replace('&', ' and ')    
f3 = f3.replace('|', ' or ')    
print('数组表示的f3=', f3)    
# 由f3结合lambda表达式以动态创建函数 
# f3= (xs[1]  and  xs[3]  and   not xs[2])  or  (xs[3]  and   not xs[0]  and   not xs[2])  or  (xs[1]  and  xs[2]  and   not xs[0]  and   not xs[3])
F3 = eval('lambda  xs : ' + str(f3))
# 把minterms中的项代入计算,检查是否不等于0
for no, row in enumerate(tbl):    
    value = True if no in yTrueIdx else False
    val = F3(row)
    print(no, row, int(value), int(val), 'Ok' if int(value) == int(val) else 'Err')

运行结果:

真值表
p q r -> exp
---------------
0 0 0 -> 0
0 0 1 -> 0
0 1 0 -> 1
0 1 1 -> 0
1 0 0 -> 1
1 0 1 -> 1
1 1 0 -> 1
1 1 1 -> 1
逻辑表达式可满足性判别并求解
[r, p, q]
---------------
[[0 1 1]
[0 1 0]
[0 0 1]
[1 1 1]
[1 1 0]]
合取范式cnf= (p | q) & (p | ~r)
析取范式dnf= p | (q & ~r)
合取范式cnf= (p | q) & (p | ~p) & (p | ~r)
析取范式dnf= p | (q & ~p & ~r)
code= a,b,c,d = symbols('a b c d')
最小项 [[0, 0, 0, 0], [0, 0, 0, 1], [0, 0, 1, 0], [0, 0, 1, 1], [0, 1, 0, 1], [0, 1, 1, 0], [1, 0, 1, 0], [1, 1, 0, 1]]
函数SOP形= (~a & ~b) | (b & d & ~c) | (c & ~a & ~d) | (c & ~b & ~d)
函数POS形= (b | c | ~a) & (c | d | ~b) & (b | ~a | ~d) & (d | ~a | ~b) & (~b | ~c | ~d)
数组表示的f3= ( not xs[0]  and   not xs[1])  or  (xs[1]  and  xs[3]  and   not xs[2])  or  (xs[2]  and   not xs[0]  and   not xs[3])  or  (xs[2]  and   not xs[1]  and   not xs[3])
0 [0 0 0 0] 1 1 Ok
1 [0 0 0 1] 1 1 Ok
2 [0 0 1 0] 1 1 Ok
3 [0 0 1 1] 1 1 Ok
4 [0 1 0 0] 0 0 Ok
5 [0 1 0 1] 1 1 Ok
6 [0 1 1 0] 1 1 Ok
7 [0 1 1 1] 0 0 Ok
8 [1 0 0 0] 0 0 Ok
9 [1 0 0 1] 0 0 Ok
10 [1 0 1 0] 1 1 Ok
11 [1 0 1 1] 0 0 Ok
12 [1 1 0 0] 0 0 Ok
13 [1 1 0 1] 1 1 Ok
14 [1 1 1 0] 0 0 Ok
15 [1 1 1 1] 0 0 Ok

使用sympy实施命题逻辑变量的定义及表达式的可满足性求解;

进一步,随机生成真值表,利用sympy的积和形或和积形表达方式获取对应真值表的决策函数符号表达式(其本质相当于实现了二值分类)——相当于决策表算法;利用这一特性,可对多元特征的选取提供简练选择方法.

方法特点在于简练——进一步用途,需要读者深入思考.

sympy 2jax 将 SymPy 表达式 转换为参数化,可微分,可矢量化的JAX 函数 。 所有 SymPy 浮点数都将成为可训练的输入参数。 SymPy 符号成为传递矩阵的列。 pip install git+https://github.com/MilesCranmer/ sympy 2jax.git import sympy from sympy import symbols import jax import jax . numpy as jnp from jax import random from sympy 2jax import sympy 2jax 让我们在 SymPy 创建一个 表达式 : x , y = symbols ( 'x y' ) expression = 1.0 * sympy . cos ( x ) + 3.2 * y 让我们 获取 JAX版本。 我们传递方程式和所 文章目录 合取 范式( conjunctive normal form (CNF)) 析取范式 (disjunctive normal form (DNF))简化的 合取 析取范式 标准形式(Canonical form)异或标准形式(xor normal form)二元 决策 图 form (ROBDD)子句标准形式(clause form) 合取 范式( conjunctive normal form (CNF)) 任何命题公式,最终都能够化成 (A1∨A2)∧(A3∨A4)(A_1 \vee A_2) \wedge ( CNF 是 合取 范式的简称,是可满足问题 比较重要的概念。在实际应用 ,我们一般将约束写成 CNF 范式的格式,然后通过求解器 Solver 对其进行求解。因此 CNF 可以理解为一种问题约束的表现形式。 本文对 CNF 的基本概念,存储形式,及其应用做一点简要的介绍。 python -m http.server 然后在浏览器 打开0.0.0.0:8000。 该网站是在上自动生成的。 这些页面使用分支 的GitHub页面提供。 应该对分支进行所有修改。 gh-pages分支是自动生成的。 请注意, sources分支根目录 的所有文件都同步到gh-pages分支。 如果要添加未翻译的其他文件,则可以在此处添加它们。 但是请考虑: 任何包含内容的页面都应添加到templates以便可以对其进行翻译。 任何图像都应添加到media 。 Python Sympy 详细使用 遇到复杂 计算 python 绝对不让你失望, sympy 是一个 Python 的科学 计算 库,用一套强大的符号 计算 体系完成诸如多项式求值、求极限、解方程、求积分、微分方程、级数展开、矩阵运算等等 计算 问题。虽然Matlab的类似科学 计算 能力也很强大,但是 Python 以其语法简单、易上手、异常丰富... Sympy 是一个符号 计算 Python 库。它的目标是成为一个全功能的 计算 机代数系统,同 保持代码简洁、易于理解和扩展。它完全由 Python 写成,不依赖于外部库。 SymPy 支持符号 计算 、高精度 计算 、模式匹配、绘图、解方程、微积分、 组合 数学、离散 数学、几何学、概率与统计、物理学等方面的功能。官方在线文档:Welcome to SymPy ’s documentation! sympy 库安装:pip3 i...