コンピュータサイエンスにおいて、プログラム合成とは、証明可能なプログラムを構築するタスクである。与えられた高レベルの形式仕様を満たす。プログラム検証とは対照的に、プログラムは与えられるのではなく構築される。ただし、どちらの分野も形式証明技術を使用し、どちらも自動化の度合いが異なるアプローチを含む。自動プログラミング技術とは対照的に、プログラム合成における仕様は通常、適切な論理計算における非アルゴリズム的な記述である。[ 1 ]
プログラム合成の主な用途は、仕様を満たす正確で効率的なコードを書くというプログラマーの負担を軽減することです。しかし、プログラム合成は超最適化やループ不変条件の推論にも応用されています。[ 2 ]
1957年にコーネル大学で開催された記号論理学夏季研究所において、アロンゾ・チャーチは数学的要件から回路を合成するという問題を定義した。[ 3 ]この研究は回路のみに言及しており、プログラムには言及していないものの、プログラム合成の最も初期の記述の1つと考えられており、一部の研究者はプログラム合成を「チャーチの問題」と呼んでいる。1960年代には、人工知能の研究者によって「自動プログラマー」に関する同様のアイデアが検討された。
それ以来、さまざまな研究コミュニティがプログラム合成の問題に取り組んできた。注目すべき研究としては、1969年のBüchiとLandweberによるオートマトン理論的アプローチ[ 4 ]、およびMannaとWaldingerによる研究(1980年頃)などが挙げられる。現代の高水準プログラミング言語の開発も、プログラム合成の一形態として理解することができる。
21世紀初頭には、形式検証コミュニティおよび関連分野でプログラム合成の概念に対する実用的な関心が急増した。Armando Solar-Lezamaは、プログラム合成問題をブール論理でエンコードし、ブール充足可能性問題のアルゴリズムを使用してプログラムを自動的に見つけることが可能であることを示した。 [ 5 ]
2013年、ペンシルベニア大学、カリフォルニア大学バークレー校、マサチューセッツ工科大学の研究者らによって、構文誘導型合成(SyGuSと略記)と呼ばれるプログラム合成問題の統一フレームワークが提案された。[ 6 ] SyGuSアルゴリズムへの入力は、論理仕様と、有効な解の構文を制約する式の文脈自由文法から構成される。 [ 7 ]例えば、2つの整数の最大値を返す関数fを合成する場合、論理仕様は次のようになる。
( f ( x , y ) = x ∨ f ( x , y ) = y ) ∧ f ( x , y ) ≥ x ∧ f ( x , y ) ≥ y
そして文法は次のようになるかもしれない。
< Exp > ::= x | y | 0 | 1 | < Exp > + < Exp > | ite( < Cond > , < Exp > , < Exp > ) < Cond > ::= < Exp > <= < Exp >ここで「ite」は「if-then-else」を表します。
ite(x <= y, y, x)
これは文法と仕様に準拠しているため、有効な解決策となるでしょう。
2014年から2019年にかけて、毎年開催される構文誘導型合成コンペティション(SyGuS-Comp)では、プログラム合成のためのさまざまなアルゴリズムが競技形式で比較されました。[ 8 ]このコンペティションでは、 SMT-Lib 2に基づく標準化された入力フォーマットである SyGuS-IF が使用されました。たとえば、次の SyGuS-IF は、2 つの整数の最大値(上記参照)を合成する問題をエンコードしたものです。
(セットロジックLIA) (synth-fun f ((x Int) (y Int)) Int ((i Int) (c Int) (b Bool)) ((i Int (cxy (+ ii) (ite bii))) (c Int (0 1)) (b Bool ((<= ii))))) (declare-var x Int) (declare-var y Int) (制約 (>= (fxy) x)) (制約 (>= (fxy) y)) (制約 (または (= (fxy) x) (= (fxy) y))) (チェックシンセ)
準拠したソルバーは、次のような出力を返す可能性があります。
((define-fun f ((x Int) (y Int)) Int (ite (<= xy) yx)))
反例誘導型帰納合成(CEGIS)は、健全なプログラム合成器を構築するための効果的なアプローチです。[ 9 ] [ 10 ] CEGISは、候補プログラムを生成するジェネレータと、候補が仕様を満たしているかどうかをチェックする検証器という2つのコンポーネントの相互作用を伴います。
入力の集合I、可能なプログラムの集合P、および仕様Sが与えられたとき、プログラム合成の目標は、Iのすべての入力iに対してS ( p , i ) が成り立つようなP内のプログラムp を見つけることです。CEGIS は、ジェネレータと検証器によってパラメータ化されています。
CEGISは、ジェネレーターと検証器をループで実行し、反例を蓄積します。
アルゴリズムcegisは入力です : プログラムジェネレータ生成、 検証者検証、 仕様spec、 出力:仕様を満たすプログラム、または失敗 inputs := 空の集合 loop candidate := generate ( spec , inputs ) if verify ( spec , candidate ) then return candidate else verifyが反例eを生成する add e to inputs end if
CEGISの実装では、通常、検証ツールとしてSMTソルバーが使用されます。
CEGISは、反例誘導型抽象化洗練(CEGAR)に触発されたものである。 [ 11 ]
1980 年に発表されたMannaとWaldingerのフレームワーク[ 12 ] [ 13 ]は、ユーザーが指定した一階述語論理式から始まります。その式に対して証明が構築され、それによって統一置換から関数型プログラムも合成されます。
このフレームワークは表形式で表示され、列には以下の内容が含まれます。
まず、背景知識、前提条件、事後条件を表に入力します。その後、適切な証明規則を手動で適用します。このフレームワークは、中間式の人間による可読性を高めるように設計されています。古典的な分解とは異なり、節正規形を必要とせず、任意の構造を持ち、任意の結合子を含む式(「非節分解」)で推論することを可能にします。証明は、次の条件を満たせば完了します。目標欄で導き出された、または同等に、アサーション列に記載されています。このアプローチで得られたプログラムは、開始した仕様式を満たすことが保証されています。この意味で、それらは構成上正しいです。[ 14 ]条件演算子、再帰演算子、算術演算子、その他の演算子[注3 ]で構成される、最小限でありながらチューリング完全な[ 15 ]純粋関数型プログラミング言語のみがサポートされています。このフレームワーク内で実行されたケーススタディでは、除算、剰余[ 16 ]平方根[ 17 ]項の単一化[ 18 ]リレーショナルデータベースクエリへの応答[ 19 ]やいくつかのソートアルゴリズム[ 20 ] [ 21 ]などを計算するアルゴリズムが合成されました。
証明規則には以下が含まれます。
マレーは、これらの規則が一階述語論理に対して完全であることを示した。[ 24 ] 1986年、マンナとワルディンガーは、等号も扱うために一般化されたE分解規則とパラモジュレーション規則を追加した。[ 25 ]後に、これらの規則は不完全であることが判明した(しかし、それでも健全である)。[ 26 ]
おもちゃの例として、最大値を計算する関数プログラム2つの数字そして以下のように導出できる。
要件の説明「最大値は任意の与えられた数値以上であり、与えられた数値のいずれかである」から始めて、一次式は、その形式的な翻訳として得られます。この式は証明されるべきものです。逆スコレム化により、[注4 ] 10行目の仕様が得られ、大文字と小文字はそれぞれ変数とスコレム定数を表します。
11行目で分配法則の変換規則を適用した後、証明目標は選言となり、したがって12行目と13行目の2つのケースに分割できます。
最初のケースに移ると、1行目の公理を用いて12行目を解くと、プログラム変数がインスタンス化される。14行目。直感的には、12行目の最後の連言は、次の値を規定している。この場合は、 を考慮に入れなければなりません。正式には、上記の 57 行目に示されている非節解決ルールが 12 行目と 1 行目に適用されます。
降伏 真∧偽) ∧ ( x ≤ x ∧ y ≤ x ∧真、これは以下のように簡略化されます。。
同様に、14行目は解決によって15行目、そして16行目を生成します。また、2番目のケースでは、13行目も同様に処理され、最終的に18行目になります。
最後のステップでは、58行目の解決ルールを使用して、両方のケース(つまり16行目と18行目)が結合されます。このルールを適用するには、準備ステップ15 → 16が必要でした。直感的には、18行目は「in case」と読むことができます。出力は(元の仕様に関して)有効ですが、15行目には「出力は有効です。ステップ 15 → 16 により、ケース 16 と 18 の両方が相補的であることが確立されました。[注 5 ]行 16 と 18 の両方にプログラム項が含まれているため、条件式がプログラム列に現れます。目標式は導出され、証明が完了し、プログラム列の「「行にはプログラムが含まれています。」