解答集合プログラミング(ASP )は、困難な(主にNP困難な)探索問題を対象とした宣言型プログラミングの一種です。これは、論理プログラミングの安定モデル(解答集合)セマンティクスに基づいています。ASPでは、探索問題は安定モデルの計算に還元され、安定モデルを生成するプログラムである解答集合ソルバーを使用して探索を実行します。多くの解答集合ソルバーの設計に用いられる計算プロセスは、 DPLLアルゴリズムの拡張であり、原理的には常に終了します(無限ループにつながる可能性のあるPrologクエリ評価とは異なります)。
より一般的な意味では、ASP には知識表現と推論への回答セットのすべての応用[ 1 ] [ 2 ]と、これらの応用で発生する問題を解決するための Prolog スタイルのクエリ評価の使用が含まれます。
回答セットプログラミングの初期の例としては、1997 年に Dimopoulos、Nebel、Köhler によって提案されたプランニング法がある。 [ 3 ] [ 4 ]彼らのアプローチは、プランと安定モデルの関係に基づいている。[ 5 ] 1998 年に Soininen と Niemelä [ 6 ]は、現在回答セットプログラミングとして知られているものを製品構成 の問題に適用した。[ 4 ] 1999 年に、「回答セットプログラミング」という用語が、2 つの論文集のタイトルとして書籍The Logic Programming Paradigmに初めて登場した。 [ 4 ]これらの論文のうち最初のものは、検索のための回答セットソルバーの使用を新しいプログラミングパラダイムとして特定した。[ 7 ]同年、Niemelä は「安定モデル意味論を持つ論理プログラム」を新しいパラダイムとして提案した。[ 8 ]
Lparse は、元々は解答集合ソルバーsmodelsの基盤ツール (フロントエンド)として作成されたプログラムの名前です。Lparse が受け入れる言語は現在、AnsProlog [ 9 ]と呼ばれることが多く、 Answer Set Programming in Logic [ 10 ]の略です。現在では、 assat、clasp、cmodels、gNt、nomore++、pbmodelsなど、他の多くの解答集合ソルバーでも同様に使用されています。( dlvは例外で、dlv 用に書かれた ASP プログラムの構文は多少異なります。)
AnsPrologプログラムは、次の形式のルールで構成されます。
<head> : - <body> .が空の場合、記号:-("if") は削除されます。このようなルールは事実<body>と呼ばれます。Lparse ルールの最も単純な種類は制約付きルールです。
この言語に含まれるもう1つの便利な構成要素は選択です。例えば、選択ルール
{ p 、q 、r }。と言っている:どの原子を任意に選ぶか安定モデルに含める。この選択ルールのみを含むLparseプログラムには、8つの安定モデル(任意のサブセット)がある。安定モデルの定義は、選択ルールを持つプログラムに一般化されました。[ 11 ] 選択ルールは、安定モデルの意味論の下では命題論理式の略記としても扱うことができます。[ 12 ] 例えば、上記の選択ルールは、3 つの「排中」論理式の論理積の略記と見なすことができます。
Lparse の言語では、次のような「制約付き」選択ルールも記述できます。
1 { p , q , r } 2.このルールは、少なくとも1つの原子を選択することを意味します。ただし、2を超えない。安定モデル意味論におけるこの規則の意味は、命題式で表される。
基数境界はルールの本文内でも使用できます。例えば、次のようになります。
:- 2 { p , q , r }。この制約をLparseプログラムに追加すると、少なくとも2つの原子を含む安定モデルが除外されます。この規則の意味は、命題式で表すことができる。
Lparseでは、変数(Prologのように大文字で表記)は、同じパターンに従うルールの集合を省略したり、同じルール内のアトムの集合を省略したりするために使用されます。例えば、Lparseプログラムでは、
p ( a ). p ( b ). p ( c ) . q ( X ) :- p ( X ), X ! = a .と同じ意味です
p ( a ) .p ( b ).p ( c ) .q ( b ) .q ( c ) .このプログラム
p ( a ) .p ( b ) .p ( c ). { q ( X ):- p ( X )} 2.は略語です
p ( a ) .p ( b ) .p ( c ). { q ( a ), q ( b ), q ( c )} 2.範囲は次の形式です。
(開始…終了)ここで、start と end は定数値の算術式です。範囲は、主に互換性のある方法で数値領域を定義するために使用される表記の簡略化です。たとえば、事実
a ( 1..3 )は、
a (1 )a (2 )a (3 )範囲指定は、ルール本体でも同じ意味合いで使用できます。
条件リテラルは次の形式です。
p ( X ) : q ( X )の拡張が の場合q、{q(a1), q(a2), ..., q(aN)}上記の条件は、{p(a1), p(a2), ..., p(aN)}条件の代わりに と書くことと意味的に同等です。たとえば、
q ( 1..2 ). a :- 1 { p ( X ) : q ( X )}。は略語です
q ( 1 ). q ( 2 ). a :- 1 { p ( 1 ), p ( 2 )}。ファイルに保存されている Lparse プログラムの安定モデルを見つけるには、${filename}次のコマンドを使用します。
% lparse ${ filename } | smodels オプション0は、smodelsにプログラムのすべての安定モデルを見つけるように指示します。たとえば、ファイルにtestルールが含まれている場合
1 { p , q , r } 2. s :- not p 。するとコマンドは出力を生成する
% lparse test | smodels 0回答: 1安定モデル: qp回答: 2安定モデル: p回答: 3安定モデル: rp回答: 4安定モデル: qs回答: 5安定モデル: rs回答: 6安定モデル: rqs1グラフの着色関数ですそのため隣接する頂点のペアごとにASPを使用して検索します- 与えられたグラフの彩色(または、彩色が存在しないことの判定)。
これは、以下のLparseプログラムを使用することで実現できます。
c ( 1. . n ) 。1 { color ( X , I ) : c ( I )} 1 :- v ( X ).:- color ( X , I ), color ( Y , I ), e ( X , Y ), c ( I ).1行目では数値を定義します色である。2行目の選択ルールによれば、固有の色各頂点に割り当てる必要があります3行目の制約では、頂点に同じ色を割り当てることを禁止しています。そしてそれらをつなぐ辺が存在する場合。
このファイルを定義と組み合わせると、 のような
v ( 1..100 ). % 1,...,100 は頂点ですe ( 1 , 55 ) . % 1 から 55 への辺があります...そして、数値を使ってsmodelsを実行します。コマンドラインで指定すると、次の形式の原子smodels の出力では、-着色。
この例のプログラムは、シンプルな ASP プログラムによく見られる「生成とテスト」の構成を示しています。選択ルールは、「潜在的な解」の集合、つまり与えられた探索問題の解の集合の単純なスーパーセットを記述します。その後に制約が続き、受け入れられないすべての潜在的な解を除外します。ただし、smodels やその他の回答セットソルバーが採用する探索プロセスは、試行錯誤に基づくものではありません。
グラフにおけるクリークとは、互いに隣接する頂点の集合です。以下のLparseプログラムは、サイズが指定されたクリークを見つけます。与えられた有向グラフにおいて、それが存在しないと判断する。
n { in ( X ) : v ( X )}。:- in ( X ), in ( Y ), X ! = Y , not e ( X , Y ).これは生成・テスト構成の別の例です。1行目の選択ルールは、以下のすべてのセットを「生成」します。頂点。2行目の制約は、クリークではない集合を「除外」します。
有向グラフにおけるハミルトン閉路とは、グラフの各頂点をちょうど一度ずつ通過する閉路のことです。以下のLparseプログラムは、与えられた有向グラフにハミルトン閉路が存在する場合にそれを検出するために使用されます。ここでは、0は頂点の1つであると仮定します。
{ in ( X , Y )} :- e ( X , Y ).:- 2 { in ( X , Y ) : e ( X , Y )}, v ( X ).:- 2 { in ( X , Y ) : e ( X , Y )}, v ( Y ).r ( X ) :- in ( 0 , X ), v ( X ).r ( Y ) :- r ( X ), in ( X , Y ), e ( X , Y ).:- r ( X ) 、v ( X )ではありません。1行目の選択ルールは、エッジ集合のすべての部分集合を「生成」します。3つの制約は、ハミルトン閉路ではない部分集合を「除外」します。最後の制約は補助述語を使用しています。("0から到達可能」という条件を満たさない頂点を禁止します。この述語は6行目と7行目で再帰的に定義されています。
このプログラムは、より一般的な「生成、定義、テスト」という構成の一例です。このプログラムには、すべての「不適切な」潜在的な解決策を排除するのに役立つ補助述語の定義が含まれています。
自然言語処理では、依存関係に基づく構文解析はASP 問題として定式化できます。[ 13 ] 次のコードは、ラテン語の文 "Puella pulchra in villa linguam latinam discit"、「美しい少女は別荘でラテン語を学んでいる」を解析します。構文木は、文の単語間の依存関係を表すアーク述語によって表現されます。計算された構造は、線形に順序付けられたルート付き木です。
% ********** 入力文 **********単語( 1 , puella )。単語( 2 、プルクラ)。単語( 3 , in )。ワード( 4 、ヴィラ)。単語( 5 、リングアム)。単語( 6 、ラテン語)。ワード( 7 、discit )。% ********** レキシコン ********** 1 {ノード( X , attr ( pulcher , a , fem , nom , sg )); node ( X , attr ( pulcher , a , fem , abl , sg )) } 1 :- word ( X , pulchra )。node ( X , attr ( latinus , a , fem , acc , sg )) :- word ( X , latinam )。1 { node ( X , attr ( puella , n , fem , nom , sg )); node ( X , attr ( puella , n , fem , abl , sg )) } 1 :- word ( X , puella ). 1 { node ( X , attr ( villa , n , fem , nom , sg )); node ( X , attr ( villa , n , fem , abl , sg )) } 1 :- word ( X、villa ). node ( X 、attr ( linguam 、n 、fem 、acc 、sg )) :- word ( X 、linguam ). node ( X 、attr ( discere 、v 、pres 、3 、sg )) :- word ( X 、discit ). node ( X 、attr ( in 、p )) :- word ( X 、in ). % ********** 構文規則 ********** 0 { arc ( X 、Y 、subj ) } 1 :- node ( X 、attr ( _ 、v 、_ 、3 、sg )), node ( Y 、attr ( _ 、n 、_ 、nom 、sg )). 0 { arc ( X , Y , dobj ) } 1 :- node ( X , attr ( _ , v , _ , 3 , sg )), node ( Y , attr ( _ , n , _ , acc , sg )). 0 { arc ( X , Y , attr ) } 1 :- node ( X , attr ( _ , n , Gender , Case , Number )), node ( Y , attr ( _ , a , Gender , Case、Number )). 0 { arc ( X 、Y 、prep ) } 1 :- node ( X 、attr ( _ 、p )), node ( Y 、attr ( _ 、n 、_ 、abl 、_ )), X < Y 。0 { arc ( X 、Y 、adv ) } 1 :- node ( X 、attr ( _ 、v 、_ 、_ 、_ )), node ( Y 、attr ( _ 、p )), not leaf ( Y ) 。% ********** グラフの木性を保証する ********** 1 { root ( X ) : node ( X 、_ ) } 1. :- arc ( X 、Z 、_ ), arc ( Y 、Z 、_ ), X ! = Y 。:- arc ( X , Y , L1 ), arc ( X , Y , L2 ), L1 ! = L2 . path ( X , Y ) :- arc ( X , Y , _ ). path ( X , Z ) :- arc ( X , Y , _ ), path ( Y , Z ). :- path ( X , X ). :- root ( X ), node ( Y、_ )、X ! = Y 、パス( X 、Y )ではない。リーフ( X ) :-ノード( X 、_ ) 、アーク( X 、_ 、_ )ではない。ASP標準化ワーキンググループは、ASP-Core-2と呼ばれる標準言語仕様を作成しました[ 14 ]。最近のASPシステムはこの仕様に収束しつつあります。ASP-Core-2は、Answer Set Programming Competitionの参照言語であり、この競技では、ASPソルバーが多数の参照問題に対して定期的にベンチマークされます。
smodelsなどの初期のシステムは、バックトラッキングを使用して解を求めていました。ブールSATソルバーの理論と実践が発展するにつれて、ASSATやCmodelsなど、SATソルバーを基盤としたASPソルバーが数多く開発されました。これらのソルバーは、ASP式をSAT命題に変換し、SATソルバーを適用した後、解を再びASP形式に変換していました。Claspなどのより新しいシステムは、SATにヒントを得た競合駆動型アルゴリズムを使用するハイブリッドアプローチを採用しており、ブール論理形式に完全に変換することはありません。これらのアプローチにより、以前のバックトラッキングアルゴリズムに比べて、多くの場合桁違いにパフォーマンスが向上しています。
Potasscoプロジェクトは、clasp 、グラウンディングシステム(gringo)、インクリメンタルシステム(iclingo)、制約ソルバー(clingcon)、アクション言語からASPコンパイラ(coala)、分散メッセージパッシングインターフェース実装(claspar)など、以下の多くのシステムを包括する役割を果たしています。
ほとんどのシステムは変数をサポートしていますが、 Lparseやgringoなどのグラウンディングシステムをフロントエンドとして使用してグラウンディングを強制することで間接的にのみサポートしています。グラウンディングの必要性は節の組み合わせ爆発を引き起こす可能性があるため、オンザフライでグラウンディングを実行するシステムは有利になる可能性があります。[ 15 ]
Galliwaspシステム[ 16 ]やs(CASP) [ 17 ]などのクエリ駆動型の回答集合プログラミングの実装では、分解と共帰納法の組み合わせを使用することで、グラウンディングを完全に回避しています。
{{cite web}}: CS1メンテナンス: アーカイブサービスは非推奨になりました (リンク)