サムネがコーヒーの記事は書きかけです。

論理式の検証を再帰で実装する

離散数学でtruth tableを使って論理検証する場面がいくつかあったので、その時のためにプログラムを作っておきます。

一般に、要素が1つ増えるごとに組み合わせは2倍になるため再帰を使用して実装した方が良さそうです。

全パターン取得の再帰関数の定義

def r_TT(n:int,s:str,a:int,l:list=[]) -> list:
    if n == 0:
        return []
    else:
        if len(s+"T") == a:
            l += [s+"T"]
            l += [s+"F"]
        r_TT(n-1,s+"T",a,l)
        r_TT(n-1,s+"F",a,l)
        return l


r_TT(3,"",3)

>>>
['TTT', 'TTF', 'TFT', 'TFF', 'FTT', 'FTF', 'FFT', 'FFF']

論理式の検証

evalを使用して論理式の検証を行います。

def rep(prop:str) -> str:
    return  prop.replace(" ","").replace("¬","not ").replace("∧"," and ").replace("∨"," or ")

def leq(prop1, prop2, vl):
    prop1, prop2 = rep(prop1), rep(prop2)
    for i in r_TT(len(var_list),"",len(var_list)):
        p1, p2 = prop1 , prop2
        for j in range(len(vl)):
            p1,p2 = p1.replace(vl[j],i[j]), p2.replace(vl[j],i[j])
        if eval(p1.replace("T","True").replace("F","False")) != eval(p2.replace("T","True").replace("F","False")):
            return False
    return True

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です