2016-04-25 7 views
5

はのは、私は2つのPython関数fgを持っているとしましょう:2つのPython関数が機能的に同等かどうかを知ることはできますか?

def f(x): 
    y = x**2 + 1 
    return y 

def g(x): 
    a = x**2 
    b = a + 1 
    return b 

これら2つの関数は明らかに機能的に同等である(両方x**2 + 1を返します)。次のように機能的に同等の

私の定義は次のとおり

二つの機能fgが常に同じ入力所与同じ出力を生成する場合、fgは、機能的に等価です。

fgにグローバル変数が含まれていないとします。

python関数fgが機能的に同等であるかどうかを(人の検査なしで)自動的に判断することはできますか?

+0

私はあなたが同じバイトコードにコンパイルするかどうかをチェックできますが、それは偽のネガティブを生成する可能性があります。 – TigerhawkT3

+0

エラーの範囲内で、ランダムな入力の束を試してみてください。 –

+0

@ TigerhawkT3上記の例の 'f'と' g'が同じバイトコードにコンパイルされるかどうか知っていますか? – applecider

答えて

12

Rice's Theorem、これを行うことができれば、halting problemを解決できます。 (これはfgが常に停止することが保証されている場合にも当てはまります。)

+0

ああ、実際には、これは*かなり正確ではありません。なぜなら、Python関数は抽象的で不透明なオブジェクトではないからです。それらが同じバイトコードを持っているかどうかを比較することができます。 – Marcin

+0

@Marcin:まず、[いいえ、バイトコードとの比較は機能しません。まったく。](http://ideone.com/x0FiiZ)第2に、あなたが比較する必要がある他の区別する機能を追加したとしても、その比較は依然としてその質問の2つの機能を同等のものとして認識することさえできません。第三に、チューリングマシンも不透明ではない。 2つのPython関数を比較して分析できるのと同じように、2つのチューリングマシンを簡単に比較して分析することはできますが、どちらの分析も「私の新しいアルゴリズムは古いものと同じ結果を出すのか」といったような重要な質問に答えることはできません。 – user2357112

2

機能は、実際に同じオブジェクトである場合、あなたは、単にf == gを行うことができますし、それらが同じオブジェクトであるかどうかを確認します。

第2に、関数が同じバイトコード(f.func_code.co_code)を持つ場合、それらは同等です。

dis.disと同等ですが(おそらくもっと移植性があります)、同じ情報を得ることができます。この場合、これは偽陰性の対象となることに注意してください。

私はdillが良くなり、機能テキストを取得できることを理解しています。その情報を使用してastを使用してテキストを解析し、同様の解析を実行してコンパイラを最適化して、同じ構文ツリーに対してコードを「最適化」できるかどうかを判断できます。ここでも、同じastに単純に縮小できない機能的に同等の機能があります。

機能的に同等な機能の特定のペアでは、この検出は可能ですが、常に偽のネガティブが存在します。

関連する問題