プログラミング言語の抽象解釈の背後にある目標は何ですか?


9

私は現在、プログラミング言語の「抽象解釈」が何であるかをよりよく理解しようとしています。最小の固定要素でドメインを拡張するアイデア、連続関数の固定小数点を生成する4つの公理などを説明する良い本の章を見つけました。私はこれらの技術的な詳細を理解しています(この全体のスキームで「抽象的な解釈」が正確に何を指しているのかはよくわかりません)。

抽象解釈を使用する動機は何ですか?計算可能な関数の固定点を特定しているだけですか?主な動機は、ほとんどのプログラミング言語で再帰を使用することに由来していますか?

また、コンピュータサイエンスの学位を持っている人にとっては技術的に十分に理解できる高レベルの概要が得られれば嬉しいでしょう。私はウィキペディアのページをかなり不安に思っています。


本plzを引用してください。ウィキペディアの抽象解釈
vzn 2013年

どの本の章を読んでいますか。
Vijay D

ウィキペディアは、より技術的なトピックのチュートリアルを行うのに必ずしも最適な場所ではありません。
Vijay D

@Vijayとvznこれは私が見た1つのことです:cs.berkeley.edu/~necula/cs263/handouts/AbramskiAI.pdf
newToPL

回答:


16

抽象的解釈は非常に一般的な概念であり、多目的な概念は複数の見方を認めているため、あなたが尋ねた人に応じて、異なる説明を受け取ります。この回答の見解は私のものであり、それが一般的であるとは思いません。

動機としての計算の硬度

解決策が次のような構造を持つ決定問題から始めましょう。

決定問題

多くの場合、この手順にはNPハードの下限があります。プログラムのセマンティックプロパティをチェックすることさえ決定不可能です。私たちは何ができる?

2つの観察を行いましょう。まず、一般的な問題を解決できない場合でも、特定の問題のインスタンスを解決できることがあります。第二に、コンパイラー最適化のようなアプリケーションは、非効率の原因のすべてではないが一部を排除するコンパイラーが有用であるという点で、近似を許容します。この直感を正確にするには、次のように答える必要があります。

  1. すべてではなく一部の問題を解決することは、正式にはどういう意味ですか?
  2. 意思決定問題の近似解は何ですか?

抽象解釈のアイデア1:問題の記述を変更する

私にとって、抽象解釈の主な洞察は、問題の定式化を変更することです。これにより、はい/いいえの答えを求める代わりに、はい/いいえ/たぶん答えを求めます。

そうですね

結果として、すべての問題には、取るに足らない、一定の時間の解決策があります(出力Maybe)。これで、常にMaybeを生成するとは限らない手順の導出に注意を向けることができます。上記の質問に戻ると、一部の問題のインスタンスで機能する解決策は、解決できない問題で多分返されるものです。また、たぶんの近似ではいいいえ 、私たちはその答えが何であるかを特定できませんので。

このアイデアは、意思決定の問題に限定されません。プログラムに関するこれらの問題を考慮してください。

  1. プログラムのどのコード行が死んでいますか(実行されません)?
  2. プログラムのどの変数に定数値がありますか?
  3. プログラムのどのアサーションに違反していますか?

これらすべての状況で、不確実性のあるソリューションを検討することで、正確なソリューションから近似的なソリューションに移行できます。

  1. 死んだ一連のコード行とは何ですか?
  2. 定数値を持つプログラム内の変数のセットとは何ですか?
  3. 違反していないプログラムのアサーションのセットは何ですか?

生成されるセットは最大である必要はありません。この考え方は非常に一般的で、プログラム分析とはほとんど関係のない問題に当てはまります。

  1. mn[a,b]
  2. mnk
  3. 式への満足のいく割り当てを求める代わりに、満足のいく割り当てを含むセットを要求することができます。

元の問題に対する解決策は変更後の問題に対する解決策であるため、問題を変更しただけでなく、厳密に一般化しました。大きな未回答の質問は、次のとおりです。どのようにして近似解を見つけることができますか?

抽象解釈のアイデア2:元のソリューションの固定小数点特性

tsReach(s)stReach(s)

X={s}{w | v is in X and (v,w) is an edge}

nns

固定小数点の特性評価は設計上の決定です。一連のソリューションにはさまざまな特性があります。それらのそれぞれに異なる利点があります。プログラミング言語の場合、グラフを処理する以上の構造があります。私たちが気にする固定小数点方程式は、入力プログラムの構造に関する帰納法によって定義できます。このアイデアはプログラムに固有のものではありません。文法、論理式、プログラム、算術式などの構造化言語の要素に抽象的な解釈を適用する場合、構文オブジェクトの構造に帰納法を使用して固定小数点を定義できます。

この定点特性を与えることにより、私たちはコンピューティングソリューションの特定の方法に取り組んでいます。この固定小数点は、元の問題を解決するのと同じくらい難しいので、実際には計算しません。次のステップに進みます。

抽象解釈のアイデア3:固定小数点近似

FLGMMLML

LMFG

固定小数点転送の背後にある直観は洞察に満ちているかもしれません。固定点は、要素の(おそらくは無限)連鎖の限界と考えることができます。近似解を計算すると、この限界に近づくことになります。これは、チェーンの要素を近似することで実行できます。

stst

抽象解釈のアイデア4:固定小数点近似アルゴリズム

これまでに見たものはすべて、数学的存在の結果です。最後のステップは、近似を計算することです。近似の格子が有限である場合(または昇順/降順のチェーン条件が満たされている場合)、単純な反復手順を使用できます。ラティスが無限である場合、固定小数点の計算はまだ決定可能かもしれませんが、反復手順では不十分な場合があります。この状況では、多くの手法を使用して解をさらに近似したり、単純な反復アルゴリズムよりも正確な解にすばやくジャンプしたりします。ソリューションの計算のコンテキストでは、拡大縮小戦略の反復加速などの用語を聞きます。

概要

私の意見では、抽象的解釈は、数学的論理が推論の数学的基礎を提供するのと同じ方法で、抽象化の概念の数学的基礎を提供します。私たちが気にする多くの問題の解決策には、固定点としての特性があります。この観察は、プログラミング言語の問題だけでなく、コンピュータサイエンスにも限定されません。近似解は、固定小数点の近似として特徴付けることができ、特殊なアルゴリズムで計算されます。これらの特性とアルゴリズムは、問題のインスタンスの構造を利用します。プログラムの場合、この構造は言語の構文によって与えられます。

自然な測定基準を持たない問題の近似値を計算することは、開業医によって常に開発および改良された技術です。抽象解釈は、この芸術の背後にある科学の数学的理論の1つです。

参考資料 抽象解釈に関するいくつかの優れたチュートリアルを読むことができます。

  1. Abstract Interpretation、Patrick Cousot(Radhia Cousotとの共同作業)、システム生物学と形式手法に関するワークショップ(SBFM'12)のカジュアルな紹介
  2. 抽象解釈によるコンピューターシステムの正式な検証の穏やかな紹介、PatrickおよびRadhia Cousot、Marktoberdorf Summer School 2010。
  3. 講義13:抽象化パートI、Patrick Cousot、抽象解釈、MITコース。
  4. アブストラクトインタープリテーション入門、サムソンエイブラムスキーとクリスハンキン、宣言型言語のアブストラクトインタープリテーション、1987年。
  5. 抽象的解釈と論理プログラムへの適用、Patrick and Radhia Cousot、1992。最初の2つのセクションには、いくつかの例を含む一般的な高レベルの概要があります。

7

これらすべての詳細から要点を抽出することはしばしば困難であることに同意します。(実際、私が見た抽象的な解釈のすべての扱いにおける私の大きな問題は、動機づけをすることなく、非常に多くの機械を提示することです。)

これが私の考えです。

抽象的解釈とは、大規模な入力のセットでプログラムをほぼ同時に実行することです。

これはすべてを網羅しているわけではありませんが、一般的にはうまくいきます。

正規の例は、算術式を評価して結果の符号を決定することです。すべての正の入力で式を評価し、結果のセットを返すことができる、仮想の無限に高速なマシンを想像できます。これらのいずれかを使用している場合は、原則として、「このプログラムは正の数を指定すると正の数を返す」などのことを決定できます。

しかし、もちろんあなたは実際にはそのマシンを持っていません。あなたね、実際の生活の中で立ち往生、あなたはどちらかと同じことしなければならないので、象徴的、時には正確な答えを与えるが、しばしば失敗する、またはすることができ、常に答えを返すという方法では、彼らは正確ではないかもしれません。後者は抽象的な解釈が行うことです。

{neg,zero,pos}{{...,2,1},{0},{1,2,...}}

add:pos×pospos

add:pos×posposadd(a,b)abpos×neg(poszeroneg)

抽象解釈が可能な限りタイトであることを証明したい場合は、この対応を形式化するガロア接続が必要になります。特定の具体的なセットに対して、最も厳密な抽象セットが存在することを保証するだけです。

IOW、あなたが抽象解釈の動機として特定したのは、チューリング等価言語で抽象的な解釈を行うために必要な機構の動機です。実際の動機は、一度に多くの入力でプログラムを実行することによってプログラムの動作を要約することです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.