1

次のブール関数があるとします。

def Bottom():
    return False

def implies(var1, var2):
    if var1 == True and var2 == False: return False
    return True

def land(var1, var2):
    return var1 == True and var2 == True.

これらの3つの関数を入力として受け取り、最初の2つの関数のどの(おそらく複数のアプリケーションの)関数構成が、3番目のブール(T、F)入力ごとに3番目の関数の出力と一致するかを決定する効率的なアルゴリズムはありますか?働き?

私はPythonを使用して例を記述していますが、ソリューションをPythonやその他のプログラミング言語に制限しているわけではありません。実際、私は実際にコードを探しているのではなく、アルゴリズムの説明や、アルゴリズムが存在しない理由の説明を探しています。

ちなみに、このアルゴリズムを発見しようとした私の動機は、特定の論理接続詞のセットの機能的完全性を示すように求められたためです。これは、1つの論理接続詞が他の特定のセットによってエミュレートできることを示すことによって行います。ロジックについては、少し推測して確認する必要がありますが、可能性の広い空間を線形探索せずに、プログラムでそれをキャプチャする方法を見つけることができませんでした。

4

1 に答える 1

2

引数が 2 つのブール関数だけを見ている場合は、単純なブルート フォース手法が機能します。三項論理、三項関数、またはその両方に拡張できますが、指数関数的であるため、過度にプッシュすることはできません。ブール値のバージョンは次のとおりです。それを拡張する方法が明らかであることを願っています。

1) 二項ブール関数は関係{False, True} X {False, True} -> {False, True}です。正確には 16 個あります。これらには、1 つまたは両方の入力から独立したさまざまな機能が含まれていることに注意してください。それでは、これらの 16 個の関数だけで構成されるセットを作成してみましょう。すべてのブール関数には、対応する高階関数 X -> があることに注意してください。

2) ここで、ブール関数Take firstおよびから開始しTake second、「指定された関数」に対応する HOF を使用してクロージャを構築します。ターゲット関数がクロージャー内にある場合、指定された関数の組み合わせから達成可能です。より一般的には、すべての要素がクロージャにある場合、指定された関数はユニバーサルです。

それでは、これをあなたの例に適用しましょう。の要素を入力に対応する 4 タプルとして(F,F) (F,T) (T,F) (T,T)その順序で記述し、HOF を太字で記述します。そうBottomです。FFFF_ Implies_ の (a, b) は任意の (a,b) です。TTFTFFFF

Take firstisFFTTTake secondis ですFTFT。これが開始セットです。Bottomを使用して を追加できますが、 BottomFFFFをさらに適用しても何も追加されないことは明らかです。

これで、Impliesに適用できる関数のペアが 9 組になりました。どうぞ:

( FFTT, FFTT) == (TTTT新規)を意味します

( FFTT, FTFT) == (TTFT新規)を意味します

( FFTT, FFFF) == (TTFF新規)を意味します

( FTFT, FFTT) == (TFTT新規)を意味します

( FTFT, FTFT) ==を意味しますTTTT

( FTFT, FFFF) == (TFTF新規)を意味します

( FFFF, FFTT) ==を意味しますTTTT

( FFFF, FTFT) ==を意味しますTTTT

( FFFF, FFFF) ==を意味しますTTTT

これで、16 個の関数のうち 8 個までになりました。チェックするペアがさらにたくさんあります。これは実際には完全なセットなので、面倒になるので、次のステップは読者 (またはおそらく彼らのコンピューター プログラム) に任せます。

于 2013-02-16T00:02:48.620 に答える