精华内容
下载资源
问答
  • 通过代码编译出的程序帮助用户求出其输入的命题公式的真值表以及主析取范式和主合取范式。 要求:能够列出含三个以内变量的合式公式的真值表,并给出相应的主析取和主合取范式
  • 研究生人工智能课的作业,主合取范式转主析取范式,敲了四五个小时,亲测可用,python版本的,用anaconda可直接运行,注释详细,要的自取
  • 主析取范式与主合取范式

    万次阅读 多人点赞 2019-04-08 02:27:36
    主析取范式与主合取范式 定义设A为恰含命题变元p1,…,pn的公式。公式A'称为A的主析(合)取范式(majordisjunctive(conjunctive)normal form),如果A'是A的析(合)取范式,并且其每个合(析)取子句中p1,…,...

    主析取范式与主合取范式

     

    定义    设A为恰含命题变元p1,…,pn的公式。公式A'称为A主析(合)取范式(majordisjunctive(conjunctive)normal form),如果A'是A的析(合)取范式,并且其每个合(析)取子句中p1,…,pn均恰出现一次。

    据定义,例1.21中公式┐p→┐(p→q)的主析取范式是(p∧q)∨(p∧┐q),而其主合取范式则应是(p∨q)∧(p∨┐q)。

         例1  求公式(p∧q)∨r的主析取范式及主合取范式。

        (p∧q)∨r

         (p∧q∧(r∨┐r))∨((p∨┐p)∧(q∨┐q)∧r)

         (p∧q∧r)∨(p∧q∧┐r)∨(p∧q∧r)∨(p∧┐q∧r)∨(┐p∧q∧r)∨(┐p∧┐q∧r)

         (p∧q∧r)∨(p∧q∧┐r)∨(p∧┐q∧r)∨(┐p∧q∧r)∨(┐p∧┐q∧r)

        此即所求的主析取范式。另外

    (p∧q)∨r

    (p∨r)∧(q∨r)

    (p∨(q∧┐q)∨r)∧((p∧┐p)∨q∨r)

    (p∨q∨r)∧(p∨┐q∨r)∧(p∨q∨r)∧(┐p∨q∨r)

    (p∨q∨r)∧(p∨┐q∨r)∧(┐p∨q∨r)

    最后一式即为所求的主合取范式。

    **** 我们总结一下利用等价推演求公式的主析(合)取范式的方法步骤:

    第一步:求出该公式的析(合)取范式;

    第二步:简化各子句.除去范式中所有恒假(真)的合(析)取子句,即化掉含有互补文字对的合(析)取子句;将合(析)取子句中同一命题变元的多个出现合并为一个;

    第三步:对析(合)取范式中合(析)取子句不是每一变元都出现的,利用pp∧tp∧(q∨┐q)或pp∨fp∨ (q∧┐q)把未出现的变元补进来,并用分配律将其展开,最后得到给定公式的主析(合)取范式。

    现在我们要讨论指派与两种范式之间的联系。

    很明白,要使主析取范式取值1,只要使其一个合取子句取值1,从而须使这一子句中的每个文字都取值1,即令正文字中命题变元取值1,而令负文字中命题变元取值0。换言之,由主析取范式的一个合取子句可确定一个弄真原公式的指派;反之,亦可由弄真原公式的一个指派确定其主析取范式中的一个合取子句。弄真公式的指派与主析取范式的合取子句是一一对应的。例如,例1.23中公式的主析取范式有五个合取子句,它们分别对应于5个弄真公式的指派:

            p∧q∧r                1,1,1

                p∧q∧┐r              1,1,0

                p∧┐q∧r              1,0,1

                ┐p∧q∧r              0,1,1

                ┐p∧┐q∧r            0,0,1

        类似地,要使主合取范式取值0,只要使其一个析取子句取值0,从而须使析取子句中的每一文字取值0,即令正文字中命题变元取值0,而令负文字中命题变元取值1。换言之,由主合取范式的一个析取子句可确定一个弄假原公式的指派;反之,亦可由弄假原公式的一个指派确定其主合取范式中的一个析取子句。弄假公式的指派与主合取范式的析取子句是一一对应的,只是对应方式刚好相反,正文字对应0,负文字都对应1。例如,例1.23中公式的三个析取子句,如下对应于三个弄假指派:

    p∨q∨r                0,0,0

                p∨┐q∨r              0,1,0

                ┐p∨q∨r              1,0,0

        由以上分析,我们可以进一步得到下述结论:

        (1)每公式的主析取范式和主合取范式都是唯一确定的,因为任一公式的弄真指派及弄假指派是完全确定的。

        (2)永真式,例如p∨┐p,没有主合取范式,因为它没有弄假指派。永真式只有主析取范式,它包含所有可能的合取子句(p∨┐p的主析取范式为其自身),因为一切指派均弄真它。为讨论方便,约定永真式的主合取范式为t。

        (3)永假式,例如p∧┐p,没有主析取范式,因为它没有弄真指派。永假式只有主合取范式,它包含所有可能的析取子句(p∧┐p的主合取范式为自身),因为一切指派均弄假它。为讨论方便,约定永假式的主析取范式为f。

    (4)n个命题变元的主析取范式及主合取范式都有 个,因为不同的合取子句及析取子句都是 个,而两种主范式都是从 个子句中取若干个(0,1,…, 个)子句组成的(取0个子句组成t或f)。我们知道 + + … + = 。从真值表的角度看也是如此。一张真值表(确定了弄真指派和弄假指派)恰对应一个主析(合)取范式。因此,n个变元的真值表有多少种,便相应地有多少n个变元的主析(合)取范式。事实上,n个变元的真值表必有 行,对应于 个可能的指派,而最后一列的每一行有0,1两个可能的值,因而这一列可能的取值状况有 种,从而生成 张不同的真值表。

    (5)由于每一公式均有主析(合)取范式,因此,无限多的含n个变元的公式可以分作 (有限)个类,这一类公式都逻辑等价于它们共同的主析(合)取范式。

    展开全文
  • 南京邮电大学实验一真值表法求主析取范式和主合取范式代码 离散数学 实 验 一利用真值表法求取主析取范式以及主合取范式的实现 实验名称:利用真值表法求取主析取范式以及主合取范式的实现 实验目的:通过编程实现主...
  • 离散数学主析取及主合取范式

    千次阅读 多人点赞 2019-12-06 23:11:56
    离散数学主析取及主合取范式 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文为本人结合书本,网络资源的学习笔记,没有任何商业用途,如有任何错误,问题请广大...

    本文为本人结合书本,网络资源的学习笔记,没有任何商业用途,如有任何错误,问题请广大网友指正和提出!

    概念

    一:析取范式与合取范式

    百度百科

     	命题变项及其否定统称作文字。
     	仅由有限个文字构成的析取式称为简单析取式。
     	仅由有限个文字构成的合取式称为简单合取式。
    

    例如,文字:p,┐q,r,q.

    简单析取式: p,q,p∨q,p∨┐p∨r,┐p∨q∨┐r.

    简单合取式: p,┐r,┐p∧r,┐p∧q∧r,p∧q∧┐r**.**

    析取范式与合取范式

    (1)由有限个简单合取式构成的析取式称为析取范式

    (2)由有限个简单析取式构成的合取式称为合取范式

    (3)析取范式与合取范式统称为范式。

    例如,析取范式:**(**p┐∧q)∨r, ┐p∨q∨r, p∨┐q∨r.

    合取范式:(p∨q∨r)∧(┐q∨r), ┐p∧q∧r, p∧┐q∧r.

    求范式的步骤

    1.消去联结词→、←、↔;

    2.利用德·摩根律将否定符号┐直接移到各个命题变元之前;

    3.利用分配律。

    命题公式的析取范式与合取范式都不是唯一的。

    二:主析取及主合取范式
    1. 主析取范式:

      设命题公式A中含n个命题变项,如果A得析取范式中的简单合取式全是极小项,则称该析取范式为A的主析取范式。
      

      若干个极小项的析取(并集)。

    2. 主合取范式:

      设命题公式A中含n个命题变项,如果A得析取范式中的简单合析式全是极大项,则称该析取范式为A的主析取范式。
      

      若干个极大项的合取(交集)。

    3. 极大项,极小项

    极大项

    包含全部数目的命题变元的析取表达式。

    极小项

    包含全部数目的命题变元的合取表达式。

    所有极小项的析取为永真公式,所有极大项的合取为永假公式。

    解法

    等价公式

    常用基本等价公式:

    (G↔H)=(G→H)∧(H→G)=(¬G∨H)∧(¬H∨G);
    (G→H)=(¬G∨H);(蕴含式)
    G∨G=G,G∧G=G;(幂等律)
    G∨H=H∨G,G∧H=H∧G;(交换律)
    G∨(H∨S)=(G∨H)∨S,G∧(H∧S)=(G∧H)∧S;(结合律)
    G∨(G∧H)=G,G∧(G∨H)=G;(吸收律)
    G∨(H∧S)=(G∨H)∧(G∨S),G∧(H∨S)=(G∧H)∨(G∧S);(分配律)
    G∨0=G;G∧1=G;(同一律)
    G∧0=0,G∨1=1;(零律)
    ¬(G∨H)=¬G∧¬H,¬(G∧H)=¬G∨¬H(德摩根律)
    

    例:(p∨(q∧r))→(p∧q∧r)

    0.﹁(p∨(q∧r))∨(p∧q∧r)

    1.(﹁p∧﹁(q∧r))∨(p∧q∧r)

    2.(﹁p∧(﹁q∨﹁r))∨(p∧q∧r)

    3.(﹁p∧﹁q)∨(﹁p∧﹁r)∨(p∧q∧r)

    4.((﹁p∧﹁q)∧(r∨﹁r))∨((﹁p∧﹁r)∧(q∨﹁q))∨(p∧q∧r)
    5.(﹁p∧﹁q∧r)∨(﹁p∧﹁q∧﹁r)∨(﹁p∧q∧﹁r)∨(p∧q∧r)

    6.(﹁p∧﹁q∧﹁r)∨(﹁p∧﹁q∧r)∨(﹁p∧q∧﹁r)∨(p∧q∧r)

    主析取范式m0∨m1∨m2∨m7

    则可得出其主合取范式为M3∧M4∧M5∧M6

    1.这里也用过主析取范式与主合取范式转换的相关知识,以及极大极小项的表示,本例m0–m7的表示,具体知识不详述。

    2.使用公式转换法求主范式时,需要增加某一个命题变元,此时要注意正确加入该变
    水真公式和永假公式,同时注意正确化简公式(如上述例子的3,4步的过渡)。

    真值表

    [直接给例子吧]
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    注:

    = ”不是一个联结词,而是一种关系。而且具有以下三种性质:

    1.自反性:即G=G
    2.对称性:即若G=H,则H=G
    3.传递性:即若G=H,H=S,则G=S
    
    展开全文
  • 编程实现求解逻辑表达式的真值表、主析取范式、主合取范式对于一个含n个命题变元的表达式(n为相异的命题变元总个数),其真值表可看作由从0到2ⁿ-1的二进制数的变化表。因此,可以通过按行列举0到2ⁿ-1的二进制数来...
  • 据定义,公式┐p→┐(p→q)的主析取范式是(p∧q)∨(p∧┐q),而其主合取范式则应是(p∨q)∧(p∨┐q)。 例 求公式(p∧q)∨r的主析取范式及主合取范式。 (p∧q)∨r (p∧q∧(r∨┐r))∨((p∨┐p)∧(q∨┐q)∧r) (p∧q∧...

    定义设A为恰含命题变元p1,…,pn的公式。公式A称为A的主析(合)取范式(majordisjunctive(conjunctive)normal form),如果A是A的析(合)取范式,并且其每个合(析)取子句中p1,…,pn均恰出现一次。
    据定义,公式┐p→┐(p→q)的主析取范式是(p∧q)∨(p∧┐q),而其主合取范式则应是(p∨q)∧(p∨┐q)。
    例 求公式(p∧q)∨r的主析取范式及主合取范式。
    (p∧q)∨r
    (p∧q∧(r∨┐r))∨((p∨┐p)∧(q∨┐q)∧r)
    (p∧q∧r)∨(p∧q∧┐r)∨(p∧q∧r)∨(p∧┐q∧r)∨(┐p∧q∧r)∨(┐p∧┐q∧r)
    (p∧q∧r)∨(p∧q∧┐r)∨(p∧┐q∧r)∨(┐p∧q∧r)∨(┐p∧┐q∧r)
    此即所求的主析取范式。另外
    (p∧q)∨r
    (p∨r)∧(q∨r)
    (p∨(q∧┐q)∨r)∧((p∧┐p)∨q∨r)
    (p∨q∨r)∧(p∨┐q∨r)∧(p∨q∨r)∧(┐p∨q∨r)
    (p∨q∨r)∧(p∨┐q∨r)∧(┐p∨q∨r)
    最后一式即为所求的主合取范式。

    展开全文
  • 求公式的主合取范式和主析取范式

    热门讨论 2009-12-13 08:44:49
    求公式的主合取范式和主析取范式 c++写的类
  • 输入命题公式的合式公式,求出公式的真值表,并输出该公式的主合取范式和主析取范式。 Input 命题公式的合式公式 Output 公式的主析取范式和主合取范式,输出形式为:“ mi ∨ mj ; Mi ∧ Mj” ,极小项和 ∨ 符号...

    Description

    输入命题公式的合式公式,求出公式的真值表,并输出该公式的主合取范式和主析取范式。

    Input

    命题公式的合式公式

    Output

    公式的主析取范式和主合取范式,输出形式为:“ mi ∨ mj ; Mi ∧ Mj” ,极小项和 ∨ 符号之间有一个空格,极大项和 ∧ 符号之间有一个空格;主析取范式和主合取范式之间用“ ; ”隔开,“ ; ”前后各有一个空格。 永真式的主合取范式为 1 ,永假式的主析取范式为 0 。

    输入公式的符号说明:
    ! 非,相当于书面符号中的 “ ¬ ”
    & 与,相当于书面符号中的 “ ∧ ”
    | 或,相当于书面符号中的 “ ∨ ”

    • 蕴含联结词,相当于书面符号中的 “ → ”
    • 等价联结词,相当于书面符号中的 “ ↔ ”
      ( 前括号
      ) 后括号

    Code

    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #define N 1000
    #define MAX 10000000
    char s[N];
    bool table[30];
    int explain[30];
    int value[MAX];
    int sum = 0;
    int priority(char c)
    {
        switch (c)
        {
            case '#': return -1;
            case '!': return 5;
            case '&': return 4;
            case '|': return 3;
            case '-': return 2;
            case '+': return 1;
            case '(': return 0;
            default: return 0;
        }
    }
    void postfix()
    {
        char post[N] = { '\0' };
        int pp = -1;
        char stack[N] = { '#' };
        int ps = 0;
    
        int len = strlen(s);
        for (int i = 0; i < len; i++)
        {
            if (s[i] >= 'a' && s[i] <= 'z')
            {
                post[++pp] = s[i];
                continue;
            }
            if (s[i] == '!' || s[i] == '&' || s[i] == '|' || s[i] == '-' || s[i] == '+')
            {
                while (priority(s[i]) <= priority(stack[ps]))
                    post[++pp] = stack[ps--];
                stack[++ps] = s[i];
                continue;
            }
            if (s[i] == '(')
            {
                stack[++ps] = s[i];
                continue;
            }
            if (s[i] == ')')
            {
                while (stack[ps] != '(') post[++pp] = stack[ps--];
                ps--;
                continue;
            }
        }
        while (ps) post[++pp] = stack[ps--];
        strcpy(s, post);
        int l = strlen(s);
    }
    void settable()
    {
        memset(table, 0, sizeof(table));
        int len = strlen(s);
        for (int i = 0; i < len; i++)
        {
            if (s[i] >= 'a' && s[i] < 'z')
                table[s[i] - 'a'] = true;
        }
        for (int i = 0; i < 26; i++)
            if (table[i]) sum++;
        sum = pow(2, sum);
    }
    int btoi()
    {
        int sum = 0, weight = 1;
        for (int i = 25; i >= 0; i--)
            if (table[i])
            {
                if (explain[i]) sum += weight;
                weight *= 2;
            }
        return sum;
    }
    int calc(int a, int b, char c)
    {
        switch (c)
        {
            case '&': return a * b;
            case '|': if (a + b) return 1; else return 0;
            case '-': if (a == 1 && b == 0) return 0; else return 1;
            case '+': return !((a + b) & 1);
        }
    }
    int work()
    {
        int stack[N], ps = -1;
        int len = strlen(s);
        for (int i = 0; i < len; i++)
        {
            if (s[i] >= 'a' && s[i] <= 'z')
            {
                stack[++ps] = explain[s[i] - 'a'];
                continue;
            }
            if (s[i] == '!')
            {
                stack[ps] = (stack[ps] + 1) & 1;
                continue;
            }
            int ans = calc(stack[ps - 1], stack[ps], s[i]);
            stack[--ps] = ans;
        }
        return stack[0];
    }
    void assign()
    {
        int x = btoi();
        int ans = work();
        value[x] = ans;
    }
    void generate(char c)
    {
        while (c <= 'z' && table[c - 'a'] == false) c++;
        if (c > 'z')
        {
            assign();
            return;
        }
        explain[c - 'a'] = 0;
        generate(c + 1);
        explain[c - 'a'] = 1;
        generate(c + 1);
    }
    void output1()
    {
        int i = 0;
        while (i < sum && !value[i]) i++;
        if (i >= sum)
        {
            printf("0 ; ");
            return;
        }
        printf("m%d", i);
        for (i++; i < sum; i++)
            if (value[i]) printf(" ∨ m%d", i);
        printf(" ; ");
    }
    void output2()
    {
        int i = 0;
        while (i < sum && value[i]) i++;
        if (i >= sum)
        {
            printf("1\n");
            return;
        }
        printf("M%d", i);
        for (i++; i < sum; i++)
            if (!value[i]) printf(" ∧ M%d", i);
        printf("\n");
    }
    int main()
    {
        scanf("%s", s);
        postfix();
        settable();
        memset(value, 0, sizeof(value));
        memset(explain, 0, sizeof(explain));
        generate('a');
        output1();
        output2();
        return 0;
    }

    转载于:https://www.cnblogs.com/dadamrx/p/7294633.html

    展开全文
  • 法一:相信大家都会的方法是——真值表法, 把真值表写出来后,把真值为1的项合取的结果就是主析取范式, 把真值为0的项析取的结果就是主合取范式。 法二(重点):这里讲得是配凑法。配凑法能直接配出来主析取范式...
  • 主析取范式和主合取范式的c++求解程序

    千次阅读 多人点赞 2019-10-27 19:40:14
    主要思想是:先求真值表,再根据真值表输出主析取范式和主合取范式。 用!来表示非,用小写v表示析取,用^来表示合取,用~来表示双条件,用-来表示条件,用大写字母来表示命题变元。 真值表的求...
  • 编程实现用真值表法求取任意数量变量的合式公式的主析取范式和主合取范式。 要求: 能够列出任意合式公式的真值表并给出相应主析取和主合取范式。 内容: 编程实现用真值表法求取任意数量变量的合式公式的主析取...
  • 离散数学主析取范式及主合取范式

    万次阅读 多人点赞 2018-03-28 19:28:21
    今天总结了一下关于离散数学化简主析取范式以及主合取范式的一些方法。首先一般可能会用到 分配律: A∨(B∧C)&lt;=&gt;(A∨B)∧(A∨C), A∧(B∨C)&lt;=&gt;(A∧B)∨(A∧C);其次若化简式里有蕴涵...
  • 主析取范式与主合取范式原理探究

    千次阅读 2021-03-24 09:01:46
    对任意一个命题公式来说,主析取范式与主合取范式都是唯一的。 命题变元指原子化的,P,Q命题。 极小项的定义:包含全部N个命题变元的合取式,称其为极小项,且N个命题变元中,每个变元与它的否定不能同时存在,但...
  • 范式包含析取范式和合取范式,而主析取范式和主合取范式的求解也是命题逻辑的重要内容,小项和大项也是必须掌握的内容。
  • 对任意一个命题公式来说,主析取范式与主合取范式都是唯一的。 命题变元指原子化的,P,Q命题。 极小项的定义:包含全部N个命题变元的合取式,称其为极小项,且N个命题变元中,每个变元与它的否定不能同时存在,但...
  • 标题:真值表求主析取范式、主合取范式的计算机语言实现 背景 语言、环境选择 C++ Visual Studio 2010 知识涉及(关键词) 线性栈的使用 中缀表达式,后缀表达式 映射 二进制枚举 实验思路 将中缀表达式转化...
  • 实 验 一利用真值表法求取主析取范式以及主合取范式的实现 实验名称:利用真值表法求取主析取范式以及主合取范式的实现 实验目的:通过编程实现主析取范式以及主合取范式的真值表求法以巩固相关理论的掌握 实验...
  • 题目:根据给定的式子,先输出其真值表,再利用真值表法求取主析取范式以及主合取范式,输出答案。 举例:以 (P^Q) V (非P^R) 为例。 程序代码 //(P^Q) V (非P^R) //主合取范式: (非PVQV非R) ^ (非PVQVR) ^ (PV非...
  • 关于自动生成真值表/主析取范式/主合取范式的计算器 我用c++写了一个,需要的自取,如果好用请点赞 链接:https://pan.baidu.com/s/1Ji1zPDtjAc6-TDxovEzMVw 密码:8jmv 源码在下面,写了一整天,转的麻烦标明...
  • 南京邮电大学离散数学求主析取范式和主合取范式实验代码。 因为CSDN上没有好的代码,于是博主自己写了一篇。 ```cpp #include <iostream> #include <cstdlib> #include <vector> #include <...
  • 使用C++求命题公式的主析取范式与主合取范式

    千次阅读 多人点赞 2018-09-22 17:21:29
    最近的离散数学的一个上机作业,要求任意输入一个命题公式,求它的真值表与主析取范式和主合取范式。其中的命题连接词都是用特殊符号来表示(怕麻烦……),并最终选择使用C++来编写程序。 先贴代码: // 五种...
  • C++实现求主析取范式、主合取范式

    千次阅读 2016-11-01 22:42:04
    离散数学第一次上机实验,突击学完什么是主析取范式和主合取范式之后粗略地想了下实现的思路。 第一步自然是把输入的式子转换成后缀表达式。结合数据结构书上对基本四则运算的代码和前人的思路勉强写出来一个,但...
  • 针对给定的包含任意个变量的真值表,编程实现用真值表法求取其所对应的主析取范式和主合取范式。 要求: 能够掌握通过真值表求取相应主析取和主合取范式的方法及原理。 代码: /* * Author: Tob_yuhong * ...
  • C语言实现主析取范式 第一次写,不喜勿喷 (先来水一波) 先保证输入的式子是合法的 (不合法我也不会,太弱了) 难点主要是计算真值表,可以用堆栈实现,建立两个堆栈,一个储存操作符,另一个储存数值 (手写堆栈) ...
  • 离散数学上机实验,给定一个命题公式,求其主析取范式,主合取范式,能力有限,参考了我学长的一篇博客,并进行了许多优化。 本次离散数学实验,我学到了许多东西,也看了自己的不足之处 1).我深刻地体会到在比较...
  • 本程序可以实现任意输入表达式,变元数最多可为3个,即可输出主析取式和主合取式。 规定符号: ! 否定 | 析取 & 合取 -> 条件 双条件 #include ... //主合取范式 stringpdnf; //主析取范式
  • 利用真值表法求主合取范式及主析取范式的实现

    万次阅读 多人点赞 2016-09-29 18:23:45
    &|以及圆括号),程序即可输出变元真值表及主合取范式及主析取范式 《离散数学》南京邮电大学学习期间,离散数学实验一 2016.9.20 #include #include #include #include using namespace std; char str[100];...
  • 任意输入一个命题公式,计算并输出其真值表以及主析取范式,主合取范式 思路:大概就是将蕴含,等价,异或进行转化,然后使用eval()计算 #! /usr/bin/env python3 # -*- coding:utf-8 -*- sInput = '' #输入的命题...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 433
精华内容 173
关键字:

主合取范式