您的位置:首页 > 编程语言 > C语言/C++

C语言 离散数学中合式公式的判断

2017-01-16 11:11 183 查看
前段时间学离散,把一些概念用C语言实现了一下,在此做个笔记,也跟大家分享一下。
什么是合式公式?我们有必要先说明一下
(1)原子命题常项或变项是合式公式;
(2)如果A是合式公式,则(!A)也是合式公式;
(3)如果A,B是合式公式,则(A∧B)、(A∨B)、(A->B)、( A«B)也是合式公式;(此处《 代表双条件)
(4)只有有限次地应用(1)~(3)所包含的命题变元,联结词和括号的符号串才是合式公式。
例如:((A->B)->(A^B)),((AvB)->((!A)V(AvB)))
我们可以看出只要有限次的将(1),(2),(3)通过连接词连接到一起,就是一个合式公式。
那么如何去判断一个公式是否是合式公式呢?
我的思路是把复杂的公式分解为一个个简单的公式——递归算法
递归算法是把问题转化为规模缩小了的同类问题的子问题。然后递归调用函数(或过程)来表示问题的解。
一个过程(或函数)直接或间接调用自己本身,这种过程(或函数)叫递归过程(或函数).
下面来讨论一下分解过程
1.对于一个递归,我们先要确定它的出口(边界),就是在问题的规模极小时必须用直接给出解答而不再进行递归调用
那么合适公式的出口在哪,很明显便是(1),(2),(3),到了这三个状态合式公式便无法分解了。
2.如何递归,也就是将复杂的公式分解,看分解到最后是否为(1),(2),(3)形式的原子命题
分解的过程有两步:1.去除最外围的括号2.找到连接词,已连接词为中心分解两边,进行递归。
这里要用到一个重要的依据,就是公式左右括号相等。找连接词就是利用到了公式左右括号相等。
分析过程如下图
部分代码如下
对不同的位置情况递归
 
整个算法思路如上,如有错误敬请指出。源码下载路径:https://download.csdn.net/download/p_xiaojia/9738652

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: