2つの関数が拡張的に等しいかどうかを計算することは可能ですか?


9

異なる並べ替えアルゴリズムを実装する2つの関数がある場合、両方が同じ外部プロパティを持っていることをソースコードで推測できますか?それらの両方が入力として可能な未ソートのシーケンスを持ち、出力としてソートされたシーケンスを持つことを意味しますか?これらの外部プロパティは、どのようにしてソースコードによって決定されますか?そして、これらの外部プロパティをどのように説明しますか?どんな表記が使用されますか?

外部プロパティは、たとえば型システム内などで明示的に定義することによって知ることができますが、これを暗黙的に実行できるかどうか疑問に思っています。それとも、この種のセマンティクスを推測することは、どういうわけか理論的に不可能ですか?関数のようなものが常に停止して副作用がないと仮定して、これがソートアルゴリズムだけでなく任意の関数でも可能かどうかに興味があります。

意味論的意味論を見るべきですか、それとも無関係ですか?

この分野での研究へのポインタ、および私の文献検索に役立つ可能性がある主題を説明するために使用されるさまざまな用語へのポインタに興味があります。

回答:


8

はい。それらが同じであることを確認できれば、コンピューターも同様です。

Coqでの整数ソートの簡単な仕様は次のとおりです。

Inductive natlist : Type :=
| nil : natlist
| cons : nat → natlist → natlist.

Fixpoint is_sorted (l : natlist ) : bool :=
    match l with
    |  nil => true
    |  (cons x nil) => true
    |  (cons x (cons y r)) => if x <= y then is_sorted (cons y r) else false
    end.

...

Theorem sort_spec : forall l, is_sorted (sort_list l).

仕様は、依存型を使用して、ソートの宣言に直接エンコードできます。

この特定の問題について、ジョンダーリントンは70年代に、ソートの仕様を実装に機械的に変換することにより、6つのファミリーのソートアルゴリズムを導出できることを示しました。これは「セマンティクスに基づくプログラムの派生」という名前の下にあると思います。

ソフトウェアエンジニアリングの世界では、拡張的に同等の関数を見つけることは「セマンティッククローン検出」として知られています。

Dave Clarkeも、CS StackExchangeでこの質問に良い回答をしました。 -for-any-input

これはすべて、正式なメソッドプログラミング言語の傘下に入ります。確率論的意味論は、意味論をモデル化するための技法の1つのクラスですが、運用上の意味論と比較して使用するのが難しいという点で好意から外れています。


答えてくれてありがとう!これがまさに私が探していたものです。
Matthijs Steen-2012年

4
私は、表示の意味論が「支持から外れた」という状況に強く同意しません。それはあなたが誰に尋ねるかに大きく依存します。
Andrej Bauer

5

チューリングの完全なプログラミング言語における拡張の同等性は、一般に決定不可能ですが、特定の2つの関数が拡張的に同等であることを検証または改ざんすることを妨げるものではありません。

f=gバツαfバツ=gバツfgαβ


答えてくれてありがとう。Hoareロジックを調べます。Hoareロジックと比較して、表示の意味を定義するのは難しいですか、それともほとんどの言語にはあまり適していませんか?停止問題のため、一般的に外延的平等は決定不可能ですか?では、関数型言語全体のように、関数が常に停止するとしたら、それは一般的に決定可能ではないでしょうか?または、一般に決定できない理由は他にありますか?
Matthijs Steen-2012年

P0

...決定可能なコンテキストの平等があります。ただし、R。Loaderは、最終的なPCFでも決定できないコンテキスト等価性があることを示したことに注意してください。
Martin Berger

-2

簡単な答え(私はあまり時間をかけなかったことは認めます...)ライスの定理は、重要でない質問については、プログラムによって計算された関数がそのプロパティを持つかどうかを決定することはできないと言います。したがって、ここでの質問は決定不可能です


1
「... 部分関数の重要なプロパティについて...」とは記載されていないので、関数全体について決定できない可能性はありませんか?
Matthijs Steen 2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.