1. 程式人生 > 其它 >離散數學實驗一

離散數學實驗一

技術標籤:人工智慧數理基礎演算法

1. 已知命題p和q的真值,求這兩個命題的合取、析取、異或、蘊含及等價命題的真值.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2020/9/18 09:33
# @Author  : Albert Darren
# @File    : 離散數學實驗一.py
# @Software: PyCharm
# 實驗1
def experiment1(loop_count=4):
    truth_value = [0, 1]
    while loop_count > 0:
        # 請求使用者輸入
p_value = eval(input('請輸入命題p的真值(1或者0):')) q_value = eval(input('請輸入命題q的真值(1或者0):')) if p_value not in truth_value or q_value not in truth_value: print('您的輸入不合法,請重新輸入') else: print('邏輯運算結果'.center(20, '-')) print('p{}q的真值為:{}'.format(chr
(ord('\u2227')), p_value & q_value)) print('p{}q的真值為:{}'.format(chr(ord('\u2228')), p_value | q_value)) print('p{}q的真值為:{}'.format('^', p_value ^ q_value)) print('p{}q的真值為:{}'.format(chr(ord('\u2192')), int(not p_value or q_value))) print('p等價於q的真值為:{}'
.format(int(p_value == q_value))) print('-' * 20) loop_count -= 1

2. 輸出以下命題公式的真值表、主析取正規化和主合取正規化

命題公式

def experiment2():
    """
    輸出命題公式:(p∨q)→r的真值表,主析取正規化,主合取正規化
    """
    truth_value = [0, 1]
    # 主析取正規化
    dnf = []
    # 主合取正規化
    cnf = []
    # 打印表頭
    print('真值表'.center(20, '-'))
    print(' {} {} {} | {:^7} | {}'.format('p', 'q', 'r', '(p \u2228 q)', '(p \u2228 q) \u2192 r'))
    for p in truth_value:
        for q in truth_value:
            for r in truth_value:
                print(' {} {} {} | {:^7} | {:^12}'.format(p, q, r, (p | q), int(not (p | q) or r)))
                decimal_index = int(str(p) + str(q) + str(r), 2)
                if not (p | q) or r:
                    dnf.append('m' + str(decimal_index))
                else:
                    cnf.append('M' + str(decimal_index))
    print('主合取正規化:' + '\u2227'.join(cnf))
    print('主析取正規化:' + '\u2228'.join(dnf))

3. 計算與探索(選做):找出一些這樣的正整數:它可以用兩種不同的方式寫成兩個正整數的立方和,例如

def experiment3(start: int, stop: int):
    # 存放滿足要求的整數
    num_set = []
    # 取出尋找範圍內的每一個正整數
    for number in range(start, stop + 1):
        min_num = 1
        max_num = int(pow(number, 1 / 3))
        # 取出第一個數
        count = 0
        for first_num in range(min_num, max_num + 1):
            # 取出第二個數
            for second_num in range(min_num, max_num):
                if number == pow(first_num, 3) + pow(second_num, 3):
                    # print('{}={}^3+{}^3'.format(number, first_num, second_num))
                    count += 1
                    if count == 2:
                        num_set.append(number)

    return num_set

4.測試

if __name__ == '__main__':
    # double_cube_int()
    # 執行效率:35.3 ms ± 8.63 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
    print(experiment3(10, 1000))
    #  執行結果:[559, 855]
    #  執行效率:55.9 ms ± 2.23 ms per loop((mean ± std. dev. of 7 runs, 10 loops each)
    # experiment2()