(57)【特許請求の範囲】
【請求項１】
入力手段、メモリ、およびプロセッサを用いて自然言語テキストの特徴構造を統一するために使用する方法であって、
前記入力手段により自然言語テキストが入力されると、前記プロセッサがメモリ中に格納された命令を、該入力された自然言語テキストに対して実行することにより前記方法を実行し、
該方法が、
（ａ）前記プロセッサが、前記メモリ内のリンク元特徴構造を拡張し、
（ｂ）前記プロセッサが、前記メモリ内のリンク元特徴構造において、所定のコンテキストが関係付けられた所定のレジーコピーリンクのリンク先特徴構造の属性を、該メモリ内のリンク元特徴構造へコピーし、
（ｃ）前記プロセッサが、前記メモリ内のリンク元特徴構造において、所定のコンテキストが関係付けられた所定のレジーコピーリンクのリンク先属性値を、該メモリ内のリンク元特徴構造へコピーする、
ことを含み、
前記（ａ）は、
（ａ１）前記プロセッサが、前記メモリ内のリンク元特徴構造がすでに拡張されているか否か判定し、
（ａ２）前記メモリ内のリンク元特徴構造がすでに拡張されているならば、前記プロセッサが（ａ）の処理を終了し、
（ａ３）前記メモリ内のリンク元特徴構造が拡張されていないならば、前記プロセッサが、該メモリ内のリンク元特徴構造が有する複数のレジーコピーリンクの複数のリンク先特徴構造の各々に対して（ａ）を実行することにより該複数のリンク先特徴構造の各々を拡張し、
（ａ４）前記複数のリンク先特徴構造の各々に対して、前記プロセッサが（ｂ）を実行し、
（ａ５）前記複数のリンク先特徴構造の各々に対して、前記プロセッサが（ｃ）を実行する、
ことを含み、
前記（ｂ）は、
（ｂ１）前記所定のレジーコピーリンクのリンク先特徴構造内にコピーされていない属性が存在するならば、前記プロセッサが、前記コピーされていない属性を、前記メモリ内のリンク元特徴構造へコピーし、前記所定のレジーコピーリンクのリンク先特徴構造内にコピーされていない属性が存在しないならば（ｂ）を終了し、
（ｂ２）前記プロセッサが、コピーされた前記属性の各々に対して関係付けられた特徴構造から、コピーされた前記属性に対応する前記リンク先特徴構造内の属性値の各々へ、前記所定のコンテキストが関係付けられたレジーコピーリンクを追加する、
ことを含み、
前記（ｃ）は、
（ｃ１）前記所定のレジーコピーリンクのリンク先が属性値であるならば、前記属性値に関係付けられたコンテキストどうしを結合し、前記所定のレジーコピーリンクのリンク先が属性値でないならば（ｃ）を終了し、
（ｃ２）結合された前記コンテキストを、前記メモリ内のリンク元特徴構造へ追加し、
（ｃ３）前記所定のレジーコピーリンクのリンク先属性値を、前記メモリ内のリンク元特徴構造へ追加し、前記結合されたコンテキストに関係付ける、
ことを含む、
方法。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明はコンピュータを用いる自然言語処理に関する。より詳細には、本発明は、マシンの使用する特徴データ構造を単一化して、指数関数的な時間をかけずに自然言語の部分を表現する方法に関する。
【０００２】
【従来の技術及び発明が解決しようとする課題】
情報の急激な増加により、まだ実現されていない自然言語文書の自動処理に対する要求が生まれた。このようなことができれば、自然言語インタフェースにより、データベース、自然言語テキストの抜粋及び要約の自動作成、並びに自然言語の自動翻訳及び解釈を行うことができる。これらの技術の開発は、現代文法の形式の処理に必要な時間により妨げられている。
【０００３】
多くの現代文法の形式は、回帰的な特徴構造を使用して自然言語表現の文法構造を述べる。特徴構造は、プロログ等の統一ベースのプログラミング言語があれば、理解及び実行が容易であるという利点を有する。しかし特徴構造は、結局は文法上の形式により理論的にも実際的にも有効に解析されることが困難であり、不利である。実際、形式によって指数関数的な時間がかかる現象の整列はまれであるが、一般に単一化ベースのパーサーが不調和であれば、適度に複雑な文を分解するのに数分かかる。
【０００４】
レジー（lazy）コピーリンクは、単一化に関する処理時間を減少する別の方法である。レジーコピーリンクは、単一化ベースのチャートパーサーにより必要なコピーの量を減少することにより処理時間を減少する。
【０００５】
文脈単一化は、単一化に必要な処理時間を減少する別の方法である。文脈単一化は、由来する選言肢を示す命題変数を用いて種々の選言肢を注釈することにより選択的特徴構造を統合する方法である。
【０００６】
単一化に必要な処理時間を減少する全てのこれらの異なるアプローチにもかかわらず、まだ特徴構造の単一化にかかる全体的な時間を減少する必要がある。
【０００７】
【課題を解決するための手段】
コンテキストレジーコピーリンクとプロセッサを用いて２つのエッジデータ構造を単一化する方法を詳細に述べる。第１エッジデータ構造に関連するコンテキストレジーコピーリンクが単一化中に作動されるときにはいつも、コンテキストレジーコピーリンクが拡張される。まずプロセッサは、作動されたコンテキストレジーコピーリンクのターゲット属性値ペアを識別する。プロセッサは次に、ターゲット属性値ペアの属性を第１エッジデータ構造にコピーする。最後に、プロセッサは第１エッジデータ構造にコピーされた属性からのコンテキストレジーコピーリンクをターゲット属性値ペアの値に追加する。
【０００８】
本発明の一態様は、プロセッサを用いてエッジデータ構造を統一する方法であって、該プロセッサがメモリ中に格納された命令を実行することによりこの方法を実行し、前記エッジデータ構造を統一する方法が、ａ）第１エッジデータ構造を作成するステップを含み、第１エッジデータ構造が複数の関連するサブツリーを有し、第１エッジデータ構造が第１グラフデータ構造を含み、第１グラフデータ構造が空であると共に複数のコンテキストレジーコピーリンクを有し、各コンテキストレジーコピーリンクがサブツリーグラフデータ構造をポイントし、各サブツリーグラフデータ構造が複数の関連するサブツリーのうちの１つと関連し、ｂ）第１エッジデータ構造を第２エッジデータ構造と統一するステップを含み、ｃ）第１エッジデータ構造と第２エッジデータ構造との統一中に第１グラフデータ構造と関連するコンテキストレジーコピーリンクのうちの１つが作動されると、第２特徴構造に関連するコンテキストレジーコピーリンクを拡大することにより、第１グラフデータ構造を拡大するステップを含み、この第１グラフデータ構造を拡大するステップが、１）第１グラフデータ構造に関連するコンテキストレジーコピーリンクの中から選択コンテキストレジーコピーリンクを選択するステップを含み、２）選択コンテキストレジーコピーリンクによりポイントされるサブツリー特徴構造から選択属性を選択するステップを含み、選択された属性が選択属性値を有し、３）選択属性のコピーを作成し、第１グラフデータ構造において選択属性のコピーを第１属性として格納するステップを含み、４）第１属性からのコンテキストレジーコピーリンクを選択属性値に追加するステップを含む、ことを特徴とする。
【０００９】
【発明の実施の形態】
本発明を詳細に説明する前に、コンピュータシステム３０について考える。図１を参照すると、コンピュータシステム３０は、コンピュータのユーザに情報を視覚的にディスプレイするためのモニタ３２を含む。コンピュータシステム３０はまた、プリンタ３３を介してコンピュータユーザに情報を出力する。コンピュータシステム３０は、データを入力するための複数の方法をユーザに提供する。キーボード３４はマウス３５と同様に、コンピュータユーザがデータをマニュアル入力することを可能にする。コンピュータユーザはまた、ペン３８を用いて電子タブレット３６に書き込むことにより情報を入力することもできる。あるいは、コンピュータユーザは、ディスクをフロッピーディスクドライブ４２に挿入することにより、フロッピーディスク等の機械可読形式の媒体に格納されたデータを入力することができる。光学文字認識ユニット（ＯＣＲユニット）４４により、ユーザはハードコピー自然言語文書４６を入力することができ、自然言語文書４６はコード化された電子表現に変換され、この電子表現は情報交換用米国標準コード（ASCII ）であるのが典型的である。
【００１０】
プロセッサ４８は、コンピュータシステム３０のオペレーションを制御、調整して、コンピュータユーザのコマンドを実行する。プロセッサ４８は、メモリ５０又はディスクドライブ４２内のフロッピーディスク４０のいずれかのメモリ内に電子的に格納された命令を実行することにより、各コマンドに応答して適切な動作を決定し、実行する。典型的には、プロセッサ４８の動作命令は、ソリッドステートメモリ中に格納されており、命令に頻繁且つ迅速にアクセスする。メモリ５０はまた、節及び制限解を格納するためのキャッシュメモリを含む。メモリ５０を実行するために使用されることのできる半導体メモリデバイスは、読取り専用メモリ（ＲＯＭ）、ランダムアクセスメモリ（ＲＡＭ）、ダイナミックランダムアクセスメモリ（ＤＲＡＭ）、プログラマブル読取り専用メモリ（ＰＲＯＭ）、消去可能なプログラマブル読取り専用メモリ（ＥＰＲＯＭ）、電子的に消去可能なプログラマブル読取り専用メモリ（ＥＥＰＲＯＭ）（フラッシュメモリ等）を含む。
【００１１】
本発明のコンテキストレジーコピー方法は、単一化ベースで文法を解析する標準的なアプローチでは、モデル化される言語現象が文脈自由となる力を有する場合でさえ、指数関数的な時間がかかるという観察結果を利用する。即ち、単純なフレーズ構造の規則を用いて言語現象を表現することができることにより、フレーズ構造のパーサーが文を解析するのにせいぜいＯ（ｎ3 ）時間（ここでＯ（ｆ（ｎ））又はＯｆ（ｎ）は語数ｎの関数ｆ（ｎ）に比例した時間を表す）しかかからないのに、標準的な単一化ベースの特徴構造パーサーが同じ文をモデル化するにはＯ（２n ）時間が必要である。特徴構造を追加することにより、なぜ解析時間があまりにも過激に増大するのかを理解することには、チャートを用いて文脈自由文法を語数の３乗に比例した時間で如何に解析できるかということと、標準的なアプローチを使用した場合に特徴構造の追加により結果としてシステムがなぜ指数関数的になるのかということを理解することが必要である。
【００１２】
単純にはチャートは、パーサーによりすでに構成された要素を格納するためのデータ構造である。チャートを有する主な利点は、パーサーが種々の方法で文を解析しようとする時に既存の要素を再使用できることである。文法が文脈自由であれば、パーサーは要素がどのように構成されるかを知る必要もなく、要素を構成することができる。例えば、パーサーは５番目のワードから１０番目のワードにいたるＮＰが存在するかどうかを知る必要はあるが、ＮＰがその中にＰＰを有するかどうかを知る必要はない。このため、長さｎの文に対しては、構成され得るＯ（Ｃｎ2 ）個の異なる要素があるのみである（ここで、Ｃは文法により可能となる異なるカテゴリーの数である）。ｎ2 は、全ての可能なワードの位置のクロスプロダクトに由来する。概念上、チャートはまさに、左位置から始まって右位置で終わるカテゴリータイプの要素があるかどうかを示す（カテゴリー、左位置、右位置の）３次元アレイである。文の始まりで始まり、文の終わりで終了するＳカテゴリーがある場合には、文はフレーズを有する。チャートを充填する１つの方法は、全ての１つの単語の要素から始めて、２つの単語の要素の全てを構築し、次いで３つの単語、というように前のレベルの結果の上に各レベルでの構築を行うことである。これは、ＣＫＹアルゴリズムと呼ばれる。アルゴリズムがＯｎ2 ではなくＯｎ3 である理由は、各要素が複数の方法で構築されることができるからである。最悪のケースでは、大きさがＯｎである要素は、Ｏｎ個の異なる方法で構築されるおそれがある。Ｏｎ2 の要素をＯｎの方法で構築するには、Ｏｎ3 の時間が必要である。ＣＫＹアルゴリズムは、小さいものから大きいものへと特定の順序で要素が構築されることを必要とする。チャートを構成する、よりフレキシブルな方法は、処理された要素のアジェンダを維持することである。要素は一度に一つずつアジェンダから得られ、以下のように処理される。各要素は、結合できる要素に対して左と右を見る。結合される要素を見出せば、チャートをチェックして、得られた要素がチャート中に存在しているかどうかを調べる。結合される要素が見出されなければ、要素はチャートに追加され、アジェンダに置かれる。次いでプロセスは、アジェンダが空になるまで継続する。要素が任意の順序でアジェンダから得られることができるので、アジェンダにより物事がよりフレキシブルになる。このパーサーの種類は、「アクティブチャートパーサー」と呼ばれる。
【００１３】
上記アルゴリズムは、文章が解析可能か否かを決定するだけであり、妥当な解析ツリー（解析木）が何であるかを決定することはしない。しかし、この情報はこれらのアルゴリズムに単純に追加することにより得られることができる。要素がサブ要素から構成される時にはいつも、構成は、構成された要素におけるローカルサブツリーとして記録される。このようなサブツリーにより注釈されるチャートは、「解析フォレスト」と呼ばれる。パーサーが実行されると、全体の文章にスパンするＳ要素から開始し、１つのサブツリーをランダムに取り出すことにより特定の解析ツリーが読み出される。次いで、各子要素に対して、１つのサブツリーがランダムに取得される。このプロセスは、ツリーが完全に特定されるまで続けられる。一般に、このように完全に特定されるツリーは指数関数的に多く存在するおそれがあるが、それらはコンパクトな表現で格納されるので、それらに対する解析フォレストは語数の３乗に比例した時間で生成されることができる。
【００１４】
多くの文法の規則は、文脈自由フレーズ構造の規則のバックボーンに特徴構造を追加する。文法に依存して、文脈自由規則は明示的であり得る。
【００１５】
文脈自由のルールが明示的であるか暗示的であるかにかかわらず、特徴構造を解析する標準的なアプローチは、まず文脈自由フレーズ構造チャートを構築し、次いでチャートデータ構造において第２のパスをなし、特徴構造のボトム−アップを構築することである。まず、与えられた特徴に従って語彙の項から特徴構造が例示される。次いで、子要素に属する特徴構造のクロスプロダクトを得ることにより、親要素の特徴構造が構成される。一貫し得ない任意の組合せを取り除くために、クロスプロダクトが得られる。得られるのは、このポイントに対して一貫した特徴構造の集合である。子要素から親要素を構成する方法が１つより多く存在すれば、全ての解析から生成された特徴構造の集合が単一化される。このプロセスは、全ての要素の特徴構造が構成されるまで、ボトム−アップを継続する。
【００１６】
このプロセスは、各レベルにおいてクロスプロダクトが発生するために最悪のケースでは指数関数的である。例えば、各語彙のアイテムが２つの曖昧な方法である場合に、フレーズ構造の文法が曖昧でなくても、トップの要素に対してＯ（２n ）の異なる特徴構造が存在し得る。有限の値の特徴のみが使用される場合には、パーサーは、語数の３乗に比例した時間で実行するように作成されることができる。なぜなら、有限数の特徴構造のみが可能であり、各レベルにおいて、得られた方法の全てを列挙することなくどれが可能であるかを追跡するだけでよいからである。可能な特徴構造の数の上限まで到達すると、各レベルにおける特徴構造の数は成長を停止する。特徴値の全てがバイナリであれば、トップレベルの要素は、せいぜいＯ（２k ）個の異なる特徴構造を有することができる（ｋは異なる特徴の数である）。故に、有限特徴グラフのみを用いることにより、文章の長さにおける指数関数を指数関数的な文法の定数に変えることができる。不具合なことに、無限の特徴構造を解析するのに必要な時間は、同じ方法では減少されることができない。
【００１７】
ここで述べる方法は、コンテキストレジーコピーリンクを導入することにより、解析及び生成中に特徴構造を単一化するのに必要な時間を減少する。この新たなタイプのレジーコピーリンクでは、複数の選択値が複数のコンテキストレジーコピーリンクにより表現されることができ、複数のコンテキストレジーコピーリンクの各々は、それが妥当であるコンテキストにより注釈されたものである。これらのコンテキストレジーコピーリンクにより表現されるデータは、関連を持つようになり次第に拡張されて必要分のみの情報がコピーされることを保証されるまで、グラフデータ構造にコピーされない。コンテキスト単一化及び不透明なコンテキストと共に使用されると、コンテキストレジーコピーリンクは、特徴構造を単一化するのにかかる時間を減少する。従って、語数の３乗に比例した時間で文脈自由特徴構造を単一化する方法の一部として、図８及び図９を参照してこの方法を詳細に述べる。
【００１８】
図２は、言語記号列を解析又は生成する間の特徴構造のレジーコンテキスト単一化に対する命令６０を概略的に示している。命令６０は、ソリッドステートメモリ５０又はフロッピーディスクドライブ４０内に置かれるフロッピーディスク４２中で機械可読形式で格納され得る。命令６０は、任意のコンピュータ言語で行われ得る。
【００１９】
命令６０は、サブルーチン１００、１０２、１０４、１０６、１０８、１１０、１１２、１１４及び１１６の階級的なセットとして組織化される。
【００２０】
命令６０は、チャートデータ構造、グラフデータ構造、節データ構造及び解データ構造の４つのクラスのデータ構造を使用する。チャートデータ構造は、エッジデータ構造とサブツリーデータ構造を含む。各エッジデータ構造は、エッジを表すと共に、以下の情報を含む。
【００２１】
Edge（エッジ）［
id：このエッジを独特に識別する整数
right ：エッジの最も右のワードを識別する整数
left：エッジの最も左のワードを識別する整数
category（カテゴリー）：エッジの文法上のカテゴリーを示す；例えばＮＰ、Ｓ、ＶＰ等
subtrees（サブツリー）：このエッジを作成する種々の方法のリスト
graph （グラフ）：このエッジのグラフデータ構造に対するポインタ
］
【００２２】
各サブツリーデータ構造は、チョムスキー標準形でのサブツリーを示し、以下の情報を含む。
【００２３】
Subtree （サブツリー）［
partial （部分的）：ルールの左の子をポイントし、partial は、エッジの最も左のワードで始まり中央のどこかで終了する
complete（完全）：ルールの右の子をポイントし、completeは、エッジの中央のどこかで始まりエッジの最も右のワードで終了する
constraint（制約）：サブツリーを生成するためにpartial とcopmplete を如何に組み合わせるべきかを定義する
graph （グラフ）：このサブツリーのグラフデータ構造に対するポインタ
］
【００２４】
なお、各サブツリーデータ構造は、概念的に文脈自由規則がサブツリー１つ当り任意の数の子を有することができるとしても、２つのみの子、partial 及びcompleteを含む。標準的な変換を文法に適用することにより、全ての規則がバイナリである新たな文法が生成される。例えば、ルールＳ→ＮＰ  ＶＰ  ＡＤＶにこの変換を適用することにより、Ｓ→Ｓ１  ＡＤＶとＳ１→ＮＰ  ＶＰという２つの規則が生成される。
【００２５】
グラフデータ構造のクラスは、Graph 、AVPair及びCVPairという３つのタイプを含む。各グラフデータ構造は特徴構造及び関連情報を示し、以下の情報を含む。
【００２６】
Graph （グラフ）［
attrs ：このグラフデータ構造に関連するAVPairへのポインタのリスト
context （コンテキスト）：このグラフが存在するコンテキストを示し、同一のエッジに関連する他の妥当なサブツリーとそれを見分けるためにサブツリーに割り当てられた変数を対応させる
nogood：この特徴データ構造が良くないかどうかを示すブール演算値
nogoods ：nogoodであり、このグラフに関連する節のリスト
edge（エッジ）：このグラフに関連するエッジに対するポインタ
disjunctive （論理和）：グラフがＯＲグラフ、即ち多くの選択的なグラフを示す単一のグラフであるか否かを示すブール演算値
clauses （節）：このグラフに割り当てられた節のリスト
disjunctions（論理和）：局所的に例示された論理和のリスト
solutions （解）：限定セットとそれらの解に対するポインタのリスト
］
【００２７】
各AVPairデータ構造は属性コンテキスト値のペアを示し、以下の情報を含む。
【００２８】
AVPair［
attr：属性のタイプの名前
attrs ：このAVPairが示す特徴構造に含まれる属性に対するポインタのリスト
equals：この属性に対する値を格納するCVPairデータ構造に対するポインタのリスト；例えば、attrがＮＵＭであれば、このフィールド内の値は値コンテキスト内のＳＧと別のコンテキスト内のＰＬにより格納され得る
copies（コピー）：このAVPairにコピーされた、又はこのAVPairからコピーされた値に対するコピーリンクを格納するCVPairデータ構造に対するポインタのリスト
contexts（コンテキスト）：このAVPairが既に制約を有するコンテキスト
prefix（接頭辞）：このAVPairを含むAVPairに対するポインタである。例えば、ＬＦＧ項（↑SUBJ NUM）では、NUM AVPairは、その接頭辞として（↑SUBJ）AVPairを有する
graph （グラフ）：このAVPairが属する特徴データ構造へのポインタ
expanded：このAVPairに関連するコンテキストレジーリンクが拡張されたかどうかを示すブール演算値
］
【００２９】
各CVPairデータ構造はコンテキスト値ペアを示し、以下の情報を含む。
【００３０】
CVPair［
contexts（コンテキスト）：規則的なコピーリンクに対してこの値に関連するコンテキスト又は節が真であれば、任意の他の値はコンテキスト値を示す
value （値）：このCVPairに対するポインタがAVPairの等しいフィールド又はコピーに格納されているかどうかに依存して、別のAVPairデータ構造へのポインタ又は値を含む。
lazy（レジー）：value フィールドが配付先の正方向をポイントする正方向コピーリンクであるのか、又はソースの逆方向をポイントするレジーコピーリンクであるのかを示すブール演算変数
］
【００３１】
節及び論理和の２つのタイプの節データ構造がある。各節データ構造は節を示し、キャッシュアイテムのリストである、その独自の節キャッシュを有する。節データ構造は、以下の情報を含む。
【００３２】
Clause（節）：［
type（タイプ）：節のタイプ−AND 、OR、CHOICE、OPAQUE、nogood、TRUE
body（ボデー）：以下のAND 、OR、NOT 、CHOICE、OPAQUEを合併したものである
AND ｛--このタイプの節は、コンテキストの論理積である--
first ：論理積の第１節へのポインタ
rest：結合された節の残りに対するポインタ｝
OR｛--このタイプの節は、コンテキストの論理和である--
first ：論理和の第１節へのポインタ
rest：分解された節の残りに対するポインタ｝
NOT ｛--このタイプの節は、コンテキストの否定である--
negated ：否定された節｝
CHOICE（選択）｛--論理和の一次選択である
論理和：CHOICEを含む論理和データ構造に対するポインタ｝
OPAQUE｛--コンテキストを移入する
imported：包まれている移入節
graph （グラフ）：節の移入元のグラフデータ構造に対するポインタ｝
graph （グラフ）：この節が関連するグラフデータ構造に対するポインタ
cache （キャッシュ）：この節に関連する節キャッシュの領域に対するポインタ。節キャッシュのこの領域は、この節を用いて以前に実行されたオペレーションの結果を格納する
exported：この節が別のグラフデータ構造に移入されたかどうかを示すブール演算変数である
nogood：この節がnogoodであることを決定されたかどうかを示すブール演算変数である
］
【００３３】
各論理和データ構造は論理和を示し、以下の情報を含む。
【００３４】
disjunction 論理和［
count ：この論理和における選言肢の数を示す整数
context （コンテキスト）：この論理和が関連するコンテキスト
arm1−第１選択コンテキスト（１つのみの場合）
disj1 −第１選択論理和（１つより多い場合）
arm2−第２選択コンテキスト（１つのみの場合）
disj2 −第２選択論理和（１つより多い場合）
］
【００３５】
限定セットデータ構造、限定解データ構造及び内部解データ構造の３つのタイプの論理和データ構造が存在する。各グラフは、グラフの３つの解データ構造を格納するメモリ５０内の解キャッシュを有する。
【００３６】
各限定セットデータ構造は、解が探索される節の集合を示し、以下の情報を含む。
【００３７】
Restriction Set （限定セット）［
restriction set （限定セット）：解に対するエッジの解の獲得に与えられた節のリスト
solutions （解）：限定セットに対する限定された解のデータ構造に対するポインタのリスト
］
【００３８】
各限定解データ構造は、限定セットに対する解を示し、以下の情報を含む。
【００３９】
Restricted Solution （限定解）［
clauses （節）：解を構成する節のグループである。例えば、限定セットがａ：１，ｂ：０及び（ａ：０＆ｂ：０）である場合には、解はｂ：０及び（ａ：０＆ｂ：０）であり得る。これは限定セットのサブセットであるべきである。このフィールドにない限定セットに節がある場合には、その値は擬であると仮定される。
map （マップ）：節フィールドにおいて解に対する数値を求める内部解データ構造に対するポインタのリストである。特定の限定セットに対しては、内部解の全てが正確に１つの限定解のマップのメンバーでなければならない。各内部解は、各限定セット中に一度表れる。
］
【００４０】
各内部解データ構造は、Restricted Setに対する内部解を示し、以下の情報を含む。
【００４１】
Internal Solution （内部解）［
graph （グラフ）−この内部解が得られたグラフに対するポインタ
choices （選択）−局所論理和の局所選択のリスト
partial （部分的）−部分的なエッジ、すなわち左の子に対する解
complete（完全）−完全なエッジに対する解
］
【００４２】
図３はメインの命令１００をフローチャート形式で示す。
【００４３】
機械可読形式の自然言語記号列を受け取ると、プロセッサ４８はステップ１２０で命令１００を実行する。プロセッサ４８は、自然言語記号列に対して文脈自由解析フォレスト、チャートを構築する。当業者に知られている標準的な技術を用いて、チャートが構築される。チャートが構築されると、プロセッサ４８はステップ１２０を出る。
【００４４】
プロセッサ４８はステップ１２２において、全体の自然言語記号列をスパンする記号列Ｓをチャートが規定するかどうかを決定する。チャートが規定しなければ、チャートは解を有さず、プロセッサ４８はステップ１２４に分岐する。一方、全体の自然言語記号列をスパンするＳをチャートが規定すれば、チャートは解を有し得る。それに応じてプロセッサ４８はステップ１２６に進む。プロセッサ４８は、使用されている文法に関連する語彙及び文法上の制約をチャートに追加する。チャートを装飾する標準的な方法が使用される。その後、プロセッサ４８はステップ１２８に進む。
【００４５】
プロセッサ４８は、回帰的にエッジ制約の処理１０２により、及びチャートに対するグラフデータ構造を構築することにより、チャートのルートスパンエッジに対する解を見出す。これらの回帰的な呼出しにより、プロセッサ４８は、リーフに到達するまでチャートを下り、そのポイントでプロセッサ４８はグラフデータ構造を構築し、チャートを逆進し始める。チャートに対するグラフデータ構造が生成されると、プロセッサ４８はステップ１３０に進み、チャートに対する解を見出すプロセスを開始する。プロセッサ４８はエッジの解の獲得１０４によりそれを実行する。プロセッサ４８はチャートを下り、対象とする不透明な（曖昧な）コンテキスト（opaque context）を通過することにより、葉に到達するまでルートスパンエッジに対する解を見出す。そのポイントで、プロセッサ４８は、移入された不透明なコンテキストに対する局所的な解を決定し、それらの解をもってチャートを逆進し始める。これは、チャートのルートスパンエッジに対する解が見出されるまで継続する。
【００４６】
命令１０４によるエッジ解の処理は、文法の文脈自由部分に対して語数の３乗に比例した時間で発生する。文脈自由により、局所的なnogoods がよく因子分解される。故に、解計算時間が不透明な変数の数Ｋにおいて指数関数的であっても、経験により、実際に生成される解の数は小さい傾向があることが示された。命令１０４を実行した後、プロセッサ４８はステップ１２４に進み、自然言語記号列の完全な処理を行う。
【００４７】
図４、図５及び図６（これらの３つの図で本実施形態のエッジ制約処理の全容を示す）で示されるように、エッジ制約処理１０２は、プロセッサ４８が、関連のあるエッジに対するポインタを与えられたエッジのグラフデータ構造を生成することを可能にする。
【００４８】
図４を参照すると、選択されたエッジに対するポインタの受領に応答して、プロセッサ４８はステップ１４０で命令１０２を実行し始める。プロセッサ４８は、今受け取ったポインタを調査することによりグラフデータ構造を構成する必要があるかどうかを決定する。ヌルポインタは、選択されたエッジが存在しないことを示すが、それはおそらく、ヌルポインタが部分的なエッジを有さないサブツリーに由来するからである。ヌルエッジポインタに応答して、プロセッサ４８はステップ１４２に分岐する。プロセッサ４８は、選択されたエッジが真（TRUE）であることを示す；即ち、選択されたエッジデータ構造のグラフフィールド中に格納されたポインタをヌルの値にセットすることにより、任意の他のエッジと結合されることができる。その後、プロセッサ４８は呼出しルーチンに戻る。
【００４９】
エッジポインタがヌルでなければ、プロセッサ４８はステップ１５０に進む。プロセッサ４８は、選択されたエッジのグラフデータ構造を構築することに注目する。そうするために、プロセッサ４８はまず、選択されたエッジに関連する各サブツリーのグラフデータ構造を生成する。故に、プロセッサ４８はグラフデータ構造が生成されるべきサブツリーがあるかどうかを決定する。かかるサブツリーが存在すれば、プロセッサ４８はステップ１５２に進む。
【００５０】
プロセッサ４８は、ステップ１５２において選択されるサブツリーとして、残りのサブツリーの１つを選択し、ステップ１５４に進む。プロセッサ４８は、まず左の子と右の子の両方に対するグラフデータ構造を作成することにより、選択されたサブツリーに対するグラフデータ構造を生成する。故にプロセッサ４８は、エッジ制約処理１０２に対する回帰的な呼出しと、選択されたエッジとして左の子を示すことにより、選択されたサブツリーの左の子に対するグラフデータ構造を作成する。選択されたサブツリーの左の子に対するグラフデータ構造が生成されると、プロセッサ４８はステップ１５６に進む。
【００５１】
プロセッサ４８は、左の子に対するグラフデータ構造のnogoodフィールドを調査することにより、又はグラフに対するポインタがNOGOOD値１であるかどうかを調査することにより、左の子に対するグラフがnogoodであるかどうかを決定する。グラフがnogoodである場合には、選択されたサブツリーのグラフはnogoodである。この場合には、プロセッサ４８はステップ１６０に進み、選択されたサブツリーに対するnogoodグラフデータ構造を生成する。それを実行すると、プロセッサ４８はステップ１５０に戻る。一方、左の子に対するグラフがnogoodでなければ、プロセッサ４８は図５のステップ１６２に進む。
【００５２】
図５を参照すると、プロセッサ４８は、ステップ１６２において、選択されたサブツリーの右の子に対するグラフデータ構造を生成することに注目する。プロセッサ４８はエッジ制約処理１０２を呼び出し、左の子が選択されたエッジであることを示すことにより、この作業を実行する。その後プロセッサ４８は、ステップ１６４においてグラフデータ構造がnogoodであるか否かを決定する。nogoodであれば、プロセッサ４８は図４のステップ１６０に戻る。そうでなれば、プロセッサ４８はステップ１６６に進行する。
【００５３】
選択されたサブツリーの左の子と右の子の両方に対してグラフデータ構造が生成されると、プロセッサ４８は、ステップ１６６において選択されたサブツリーに対するグラフデータ構造を構成するプロセスを開始する。この試みでは、第１の作業は、選択されたサブツリーに関連する文法法上の制約をグラフデータ構造に変換することである。次にステップ１６８において、プロセッサ４８は、選択されたサブツリーのサブツリーデータ構造のグラフフィールドに、今生成されたグラフデータ構造に対するポインタを格納する。プロセッサ４８はステップ１８０に進行する。
【００５４】
プロセッサ４８は、その左の子により移入される制約を、選択されたサブツリーに導入し始める。プロセッサ４８は、一度に１つのAVPairをコピーする（後ほど詳細に説明する）AVPairコピー１０６を呼び出すことによりそれを実行する。その後ステップ１８２において、プロセッサ４８は、選択されたサブツリーのグラフデータ構造がこれによりnogoodとなるかどうかを決定する。nogoodであれば、プロセッサ４８は図４のステップ１６０に戻る。そうでない場合には、プロセッサ４８はステップ１８４に進行する。
【００５５】
プロセッサ４８は、右の子により移入された制約を、選択されたサブツリーに導入する。プロセッサ４８は、AVPairコピー１０６を再び呼び出すことによりそれを実行する。次いでプロセッサ４８はステップ１８６において、これらの制約により、選択されたサブツリーのグラフがnogoodとなるかどうかを決定する。nogoodである場合には、プロセッサ４８は図４のステップ１６０に戻る。グラフがnogoodでない場合には、プロセッサ４８はステップ１８６から図４のステップ１５０に戻る。
【００５６】
プロセッサ４８は、選択されたエッジに関連するサブツリーに対して生成されたグラフデータ構造が存在する限りは、ステップ１５０〜１８６をループする。すべてのサブツリーグラフデータ構造が生成されると、プロセッサ４８は図４のステップ１５０を出て図６のステップ１８８に渡り、そのnogoodでないサブツリーの各々を示す選択されたエッジに対する単一のグラフデータ構造を作成するプロセスを開始する。プロセッサ４８はまず、ステップ１８８においてnogoodでないグラフを有する選択エッジに関連するサブツリーの数をカウントする。次いで、ステップ１９０において、プロセッサ４８は、nogoodでないグラフを有するサブツリーの数が２つ以上であるかどうかを決定する。その数が２つ未満であれば、プロセッサ４８は、ステップ１９２においてnogoodでないグラフを有する少なくとも１つのサブツリーが存在するかどうかを決定する。nogoodグラフを有するサブツリーが１つ存在する場合には、プロセッサ４８はステップ１９３に進み、選択されたエッジのエッジデータ構造のグラフフィールド中に、良好な（nogoodでない）サブツリーに対するグラフデータ構造に対するポインタを格納する。一方、良好なグラフを有するサブツリーが一つも存在しなければ、プロセッサ４８はステップ１９２を出てステップ１９４に進む。プロセッサ４８は選択されたエッジデータ構造のグラフフィールドを使用して、ポインタ値１を格納することによりエッジがnogoodであることを示す。ステップ１９４又は１９３において選択されたエッジのグラフデータ構造の制約が完了すると、プロセッサ４８はステップ１４４に進行する。
【００５７】
プロセッサ４８は、nogoodでないグラフを有するサブツリーの数が２つ以上であれば、ステップ１９６に進行する。この場合には、選択されたエッジのグラフデータ構造は、複数の選択的なサブツリーを表すので、ＯＲタイプである。故に、ステップ１９６においてプロセッサ４８は、選択されたエッジデータ構造の論理和フィールドを適切にセットすることにより、グラフをＯＲタイプとしてマークする。これを実行すると、プロセッサ４８はステップ１９６を出てステップ１９８に進行する。
【００５８】
ステップ１９８において、プロセッサ４８はステップ１９６で生成されたＯＲ節に対する論理和データ構造を構築する。プロセッサ４８は論理和データ構造のカウントフィールドを、ステップ１８８においてカウントされた良好なグラフの数にセットする。プロセッサ４８が論理和データ構造の構成を完了すると、選択されたエッジに関連する良好なサブツリーの各々を表すコンテキスト変数が生成される。その後、プロセッサ４８はステップ２００に進行する。
【００５９】
プロセッサ４８は、サブツリーからの情報を選択されたエッジのグラフデータ構造に導入し始める。プロセッサ４８は、全ての良好なサブツリーからの情報が選択エッジデータ構造に導入されるまで、ステップ２００、２１０及び２１２をループする。ステップ２１２では、プロセッサ４８は、nogoodでないグラフを有するサブツリーのうちの１つを選択し、論理和データ構造によりサブツリーと関連するコンテキストを見出す。プロセッサ４８は、AVPairコピー１０６を呼び出し、選択された節を示すことにより、選択されたサブツリーからのデータ構造情報を選択エッジにコピーする。その後、プロセッサ４８はステップ２００に戻る。選択されたエッジに対するグラフデータ構造に良好なグラフを有するサブツリーの全てからの情報がコピーされた後、プロセッサ４８はステップ１４４に戻る。
【００６０】
図７で示されるAVPairコピー１０６により、プロセッサ４８はソースAVPiarデータ構造からの情報を配付先AVPairデータ構造にコピーすることができる。命令１０６を使用して、子からの情報が親にコピーされるばかりでなく、サブツリーからの情報が関連のあるエッジにコピーされる。
【００６１】
プロセッサ４８は、配付先AVPair、ソースAVPairに対するポインタ、及び選択された節に応答して命令１０６を実行し始める。ステップ２３０において、プロセッサ４８は、選択された節に対する２つのAVPairの間にコンテキストコピーリンクがすでに存在しているかどうかを決定する。プロセッサ４８は、ソースAVPair及び配付先AVPairの両方のコピーフィールドを調査することにより、この決定を行う。選択された節を有するコピーリンクがソースか配付先かのいずれかに見出されれば、さらなる実行の必要もなく、プロセッサ４８はステップ２４４に分岐することにより応答する。他方、選択された節を有するコンテキストコピーリンクがソースAVPairと配付先AVPairの間に存在しない場合には、プロセッサ４８はステップ２３２に分岐する。
【００６２】
ステップ２３２においてプロセッサ４８は、コンテキストレジーコピーリンクを介して配付先AVPairにおいてソースAVPairを表すことができるかどうかを決定する努力を始める。これは部分的に、配付先の他のレジーコピーリンクがすでに拡張されたかに依存する。プロセッサ４８は、配付先AVPairの拡張されたビットを調査することにより、そうであるかどうか決定する。そのレジーコピーリンクが拡張されなかったことをビットが示す場合には、プロセッサ４８は、オーバーラップしたコンテキストにおいてそのリンクが配付先AVPairだけのレジーコピーリンクであれば、コンテキストレジーコピーリンクを用いてソースAVPairを表現することができる。プロセッサ４８はステップ２３４において、AVPairコピーフィールド中に存在するレジーコピーリンクを列挙して、各レジーコピーリンクに対して、そのコンテキストを選択されたコンテキストと結合することにより、AVPairコピーに対する引数として与えられたコンテキスト内の他のコンテキストレジーコピーリンクを配付先のAVPairがすでに含んでいるかどうかを決定する。論理積の全てがnogoodである場合には、プロセッサ４８はステップ２３６に進行する。他方、結合されたコンテキストのいずれかがnogoodでない場合には、プロセッサ４８は、ステップ２３８に進行する。
【００６３】
プロセッサ４８は、配付先のAVPairに関連する全てのレジーコピーリンクが拡張される必要がある場合には、ステップ２３４からステップ２３８に進む。プロセッサ４８は、レジーリンクの拡張１０８を呼び出すことにより、ステップ２３８において、それらレジーコピーリンクを拡張する。その後、プロセッサ４８はステップ２４０に進行する。
【００６４】
プロセッサ４８は、ソースAVPairがレジーコピーリンクにより配付先のAVPairで表されることができない場合に、ステップ２４０に進む。配付先にコピーされたことをソースAVPairにおいて示すために、プロセッサ４８は配付先をポイントする正方向コピーリンクをソースAVpairのコピーフィールドに追加する。次いでプロセッサ４８は、ファクトコピー１１０を呼び出すことにより、配付先のAVpairにソースAVpairの制約をコピーする。それを実行すると、プロセッサ４８はステップ２４４に進行する。
【００６５】
図８で示されるレジーリンクの拡張１０８により、プロセッサ４８はコンテキストレジーコピーリンクを、より詳細な１つのレベルと、そして必要であれば、他のコンテキストレジーコピーリンクと取り替えることができる。ソース中の正方向コピーリンクを追加してレジーコピーリンクの拡張を記録した後、プロセッサ４８はファクトコピー１１０を呼び出すことにより関連情報をコピーする。
【００６６】
プロセッサ４８は、拡張されるべきレジーコピーリンクを有する、選択されたAVPairへのポインタの受領に応答して、ステップ２６０で命令１０８を実行し始める。ステップ２６０において、プロセッサ４８は、拡張ビットを調査することにより、選択されたAVPairのコンテキストレジーコピーリンクがすでに拡張されたかどうかを決定する。選択されたAVPairに関連するコンテキストレジーコピーリンクがすでに拡張されたことをそのビットが示せば、プロセッサ４８はステップ２７６に進む。他方、コンテキストレジーコピーリンクが拡張されていない場合には、プロセッサ４８はステップ２６２に分岐する。
【００６７】
プロセッサ４８は、拡張されたフィールドの値の拡張を示すようにセットすることにより、選択されたAVPairのコンテキストレジーコピーリンクを拡張し始める。その後、プロセッサ４８はステップ２６４に進行して、一度に一つずつコンテキストレジーコピーリンクを拡張し始める。拡張されるべきコンテキストレジーコピーリンクが残っている限りは、プロセッサ４８はステップ２６６に進行する。プロセッサは、コピーフィールド内の残りのコンテキストレジーコピーリンクを拡張するものとして選択する。次にプロセッサ４８はステップ２７０に進行する。
【００６８】
しばしば、選択されたコンテキストレジーコピーリンクによりポイントされるターゲットAVPairも、拡張される必要があるとしてレジーコピーリンクにより表される。かかる状況を見越して、ステップ２７０においてプロセッサ４８はレジーリンク拡張１０８を呼び出して、選択されたコンテキストレジーコピーリンクによりポイントされるレジーコピーリンクを拡張する。ステップ２７２では、プロセッサ４８は、選択されたAVPairをポイントするターゲットAVPairからの正方向コピーリンクを追加する。次にプロセッサ４８はステップ２７４に進行する。
【００６９】
ターゲットAVpairが拡張されると、プロセッサ４８はターゲットAVPairからの情報の１つのレベルを選択されたAVPairにコピーすることにより、選択されたレジーコピーリンクを拡張することができる。プロセッサ４８は、ファクトコピー１１０を呼び出すことにより、これを実行する。それを実行すると、プロセッサ４８はステップ２６４に戻り、選択されたAVPairに関連する全てのコンテキストレジーコピーリンクが拡張されるまで、ステップ２６６、２７０、２７２、２７４及び２６４をループする。
【００７０】
図９は、ファクトコピー１１０の命令をフローチャートで示す。
【００７１】
プロセッサ４８は、ソースAVPairと配付先AVPairに対するポインタと、配付先に関連する選択された節の受領に応答して、ステップ２９０において命令１１０を実行し始める。プロセッサ４８は、任意のファクトがコピーされる必要があるかどうかを決定することにより、ステップ２９０で開始する。nogoodである節に関連すれば、ファクトはコピーされる必要がない。プロセッサ４８は、節のnogoodフィールドを調査し、選択された節がnogoodである場合にはステップ２９２に進行する。
【００７２】
プロセッサ４８は、ソースAVPairに関連する属性を配付先AVPairにコピーする努力を始める。ステップ２９２においてコピーされるべき属性が残っていれば、プロセッサ４８はステップ２９４で残りの属性の中の１つを選択する。次に、プロセッサ４８はステップ２９６で、選択された節を、選択された属性に関連する節と結合する。プロセッサ４８は、節の結合１１２を呼び出すことにより結合を実行し、得られた節を戻す。得られた節がnogoodでなければ、プロセッサ４８はステップ３００に分岐する。
【００７３】
ステップ３００において、配付先のAVPairデータ構造がもう存在しなければ、プロセッサ４８は配付先のAVPairへと逆にポイントするものを作成し、配付先のAVPairのAttrs フィールドに、この新たなAVPairに対するポインタを追加する。情報がコピーされることのできるデータ構造が作成されると、プロセッサ４８はステップ３０２に進行してAVPairコピーを呼び出す。AVPairコピーは、コンテキストレジーコピーリンク同士の間に相互作用があるかどうかに依存して、ソースAVPairからの情報をコピーしたりしなかったりする。その後、プロセッサ４８はステップ２９２に戻る。
【００７４】
プロセッサ４８は、AVPairコピーがソースAVPairの関連のある属性全てに対して呼び出されるまで、ステップ２９２〜３０２をループする。全てに対して呼び出されると、プロセッサ４８はステップ３０４に進行して、属性のコピーと略同じ形態でソースAVPairの値を配付先のAVPairにコピーし始める。ソースAVPairに関連する全てのコンテキスト値をコピーした後、プロセッサ４８はステップ３２０に進む。プロセッサ４８は、配付先のAVPairに課された新たな制約を調査し、可能であれば、新たなローカルnogoods を推論する。これを実行すると、プロセッサ４８はステップ３２２にリターンする。
【００７５】
命令６０は２つの節を結合して新たな節を生成し、メモリ５０の節キャッシュに格納する。
【００７６】
命令６０が節を結合する方法と標準的なアプローチとの間には２つの違いがある。まず、２つの節を結合し始める前に、プロセッサ４８は同じ２つの節を含むエントリに対する節キャッシュを探索する。プロセッサ４８は、より高いｉｄを有する節データ構造のキャッシュフィールドを調査することにより、このような探索を開始して、所望のオペレーション及びオペランドを探索する。かかるエントリが見出されると、結合を行うことなく、以前に格納された結果を使用することができ、処理時間が削減される。
【００７７】
節を結合することに対する標準的なアプローチとの第２の違いは、不透明な（曖昧な）節（opaque clause ）の使用である。図１０のフローチャートは、不透明な節を処理して単一化処理時間を減少する節の結合１１２の部分を示している。２つの不透明な節が同一グラフから移入されると、２つの不透明な節は解かれて、新たな節を生成するように結合され、この新たな節が包まれて、新たな不透明節が生成され、そしてこれが移入される。
【００７８】
プロセッサ４８はステップ３６０で命令１１２を実行し始める。プロセッサ４８は、２つの不透明な節が同一のグラフデータ構造に関連する場合にグラフ同士の間に移入される命題変数の数を減少することができる。プロセッサ４８は、結合されるべき２つの節データ構造である節１及び節２のグラフフィールドを調査することにより、ステップ３６０においてこの可能性をチェックする。両方の節が同一のグラフに関連する場合には、プロセッサ４８はステップ３６０を出て、ステップ３６２に分岐する。
【００７９】
２つの不透明な節の結合によって、真（TRUE）又はnogoodのようなより単純な節を生じ得ることができるので、プロセッサ４８はステップ３６２において節１及び節２の両方を「解く」。プロセッサ４８は、各不透明な節の移入フィールドを検索することにより、不透明な節を解く。その後、プロセッサ４８はステップ３６４において、節の結合１１２を呼び出すことにより、２つの解かれた節を結合する。プロセッサ４８は、ステップ３６６において得られた節を調査して、それがnogoodであるかどうかを決定する。nogoodである場合には、プロセッサ４８はステップ３６８に進行して、得られた節がnogoodであることを示すポインタを戻す。一方、得られた節がnogoodでない場合には、プロセッサ４８はステップ３７０に分岐する。
【００８０】
プロセッサ４８は得られた節を「包み」、ステップ３７０において節の移入１１６を呼び出すことにより新たな不透明な節を移入する。次いでプロセッサ４８はステップ３７２に進む。
【００８１】
節１及び節２を再び結合するさらなる処理時間を使用しないようにするために、ステップ３７２において、プロセッサ４８は節１及び節２を結合したものをメモリ５０の節キャッシュに格納する。好ましくは、節キャッシュ内の節は、ｉｄの高さに従ってインデックスされ、格納される情報は、オペレータ、オペランド及び得られた節のトリプルである。このケースでは、トリプルは、結合、節２、得られた節である。その後プロセッサ４８は、より高いｉｄを有する節に対して、節データ構造のキャッシュフィールドにおける節キャッシュに、このエントリに対するポインタを格納する。プロセッサ４８は、２つの節が結合されたり分離されたりする場合にはいつも、それらが不透明であるか否かにはかかわらず、ステップ３７２を実行する。節に関する全てのオペレーションの結果を格納することにより、グラフデータ構造を単一化する処理時間が減少される。
【００８２】
図１１は、節をグラフに移入する命令１１６をフローチャートで示す。これを実行する際に、プロセッサ４８は新たな不透明節データ構造を作成して、移入された節を「包む」。これにより、ルートスパンエッジに対して生成されたグラフが、文脈自由に等しくなることが保証され、これは複数の命題変数を単一の命題変数と取り替えることにより可能となる。
【００８３】
プロセッサ４８は、選択された節、即ち移入される節が選択されたグラフに既に移入されたかどうかをステップ４００で決定することにより、命令１１６を実行し始める。プロセッサ４８は、得られた節が選択された節に等しいエントリに対して節キャッシュを探索することにより、それを実行する。プロセッサ４８がかかるエントリを見出せば、選択された節は選択されたグラフにすでに移出されており、これを実行する必要がなくなる。これに応答して、プロセッサ４８はステップ４０２に分岐して、移入節をリターンする。一方、選択された節が移出されたことを節キャッシュが示さない場合には、プロセッサ４８はステップ４０４に分岐する。
【００８４】
ステップ４０４において、プロセッサ４８は新たな不透明節データ構造を作成して、移入フィールドに選択された節を格納する。その後ステップ４０６において、プロセッサ４８は不透明変数が移入フィールドに移出されたことを記録し、グラフフィールドにおいて選択グラフに対するポインタを格納することにより、どのグラフに移出されたのかを示す。最後に、ステップ４０８においてプロセッサ４８は、選択された節、不透明節、新たな不透明節のトリプルを格納することにより、メモリ５０の節キャッシュにこのオペレーションの結果を格納する。新たな不透明節が移入されると、プロセッサ１１はステップ４０２に戻る。
【００８５】
図１２、図１３及び図１４（これら３つの図で本実施形態の解の獲得命令の全容を示す）は、選択されたエッジに関連する全ての節に対して解が探索されていない可能性があるために、限定セットと呼ばれる解が探索される節を与えられた選択エッジに対する解の獲得命令１０４をフローチャートで示している。限定セットが関連する選択エッジに対するポインタも、命令１０４に渡される。
【００８６】
命令１０４の実行はステップ４５０で始まる。ステップ４５０においてプロセッサ４８は、選択エッジに対する明白な解を探索し始める。３つのプロセスがある。まず、プロセッサ４８は選択エッジに対するポインタを調査する。ポインタがヌルであれば、選択エッジが他の任意のエッジとうまく結合されることができることを意味する。このような発見に応答して、プロセッサ４８はステップ４５２に進み、選択されたエッジに対する解が真（TRUE）であることを示す。プロセッサ４８はステップ４５４に戻る。一方、選択されたエッジに対するポインタがヌルでなければ、プロセッサ４８はステップ４６０に分岐して、選択されたエッジに対する別の明白な解を調査する。ステップ４６０において、プロセッサ４８は選択されたエッジデータ構造のグラフのnogoodフィールドを調査して、選択されたエッジがnogoodであるかどうかを決定する。そうであれば、ステップ４６２においてプロセッサ４８は選択されたエッジに対する解をヌルにセットし、ステップ４５４に戻る。選択されたエッジがnogoodのカテゴリーに分類されなければ、プロセッサ４８はステップ４６０を出て、最後の明白な解を検索する。ステップ４６４において、プロセッサ４８は、この限定セットがすでに解決されたかどうかを調べるために、グラフの解キャッシュを探索する。解決の場合には、プロセッサ４８はステップ４６６において、もしあれば解に対するポインタをリターンする。
【００８７】
明白で簡単な解を見出す試みが失敗すれば、プロセッサ４８はステップ４６８に進む。プロセッサ４８は、解キャッシュにおける選択された節に対する限定解データ構造を作成して、全てのフィールドをヌルにセットする。これを実行すると、プロセッサ４８はステップ４７０に進み、選択された限定セットに対する解を求めて一度に１つのサブツリーずつ探索し始める。ステップ４７２において、プロセッサ４８は、解を必要とするサブツリーの１つを選択する。次にプロセッサ４８は、選択されたサブツリーのグラフデータ構造のnogoodフィールドを調査することにより、選択されたサブツリーがnogoodであるかどうかを決定する。選択されたサブツリーがnogoodである場合には、プロセッサ４８はステップ４７０に戻ることにより、他のサブツリーに注意を向ける。一方、選択されたサブツリーのグラフがnogoodでなければ、プロセッサ４８はステップ４７６に進行する。
【００８８】
選択されたサブツリーの解を見出すことには、選択されたサブツリーの左と右の子に対する解をまず見出すことが必要である。これは図１２のステップ４７６から図１３のステップ４８６において発生する。まずプロセッサ４８は、選択されたサブツリーの左の子からどのサブツリーグラフの節が移入されるかを決定し、新たな限定セットを定義する。プロセッサ４８はステップ４７８でこの情報を用いて、エッジの解の獲得１０４を呼び出すことにより、左の子に対する解を見出す。左の子に対する解がない場合には、選択されたサブツリーに対する解は存在できない。プロセッサ４８は、ステップ４７０に分岐することによりこの状況に対応し、別のサブツリーに注目する。他方、左の子が解を有する場合には、選択されたサブツリーは解を有し得る。それに応答して、プロセッサ４８はステップ４８２に分岐して、選択されたサブツリーの右の子に対する解を識別する。プロセッサ４８は、サブツリーグラフのどの節が右の子から移入されたかを識別することにより、開始する。これにより新たな限定セットが定義され、プロセッサ４８は、ステップ４８４においてエッジ解の獲得１０４を呼び出す時にこの限定セットを用いる。プロセッサ４８は、ステップ４７０に戻ることにより右の子が解を有さないという見解に応答する。一方、右の子が解を有すると、プロセッサ４８はステップ４９０に分岐する。
【００８９】
選択されたエッジの左及び右の子に対する解が得られると、ステップ４９０でプロセッサ４８は選択されたエッジに対する解を識別しようとし始める。これらの解は、限定解データ構造により表される。ステップ４９０において、プロセッサ４８は、局所的な制約が例示された時に導入された論理和に基づいて、局所的な解を作成する。プロセッサ４８は、局所的な解と左及び右の子に対する解のクロスプロダクトをとって、選択されたエッジに対する幾らかの候補内部解を生成する。プロセッサ４８は、その後のステップにおいて一度に一つずつこれら候補内部解を調査する。
【００９０】
図１４を参照すると、プロセッサ４８は、ステップ５０２において評価のために候補の内部解の１つを選択し、ステップ５０４において局所的なnogood節を用いてそれを評価し、選択された候補内部解節の妥当性を決定する。プロセッサ４８がステップ５０６において選択された候補の内部解が妥当でないと決定すれば、プロセッサ４８は図１３のステップ５００に戻って、別の候補の内部解を評価し始める。一方、選択された候補の解が妥当であれば、プロセッサ４８はステップ５０８に進む。このステップにおいて、選択された候補の内部解における節の各々は真であると仮定され、選択された限定セットの節が調査されて、それらのどれが真であるかを決定される。プロセッサ４８は、ステップ５１０において真であると評価された限定セットの節に注目し、選択された限定セットに関連する限定された論理和データ構造の節フィールド中にリストされるものとそれらを比較する。限定セットに対する解に含まれていない場合には、ステップ５１４においてプロセッサ４８は注目した節を用いて新たな限定解を作成し、限定セットに対する解にそれを追加する。最後にステップ５１６において、プロセッサ４８は選択された候補の内部解に対するデータ構造に対するポインタを、限定解データ構造のマップフィールドに追加する。
【００９１】
１つの候補の解の評価が完了すると、プロセッサ４８は図１３のステップ５００に戻って、ステップ５０２〜５１６を参照して説明されたように候補の内部解の調査を継続して行う。選択されたサブツリーに対する候補の内部解を調査した後、プロセッサ４８はステップ５００から図１２のステップ４７０に分岐する。選択されたエッジに関連するサブツリーの全てを処理した後、プロセッサ４８はステップ４５４に戻り、任意の解を限定セットに戻す。
【図面の簡単な説明】
【図１】本発明の方法を用いるコンピュータシステムを示す。
【図２】本発明の方法を実行するソフトウェアルーチンの図である。
【図３】メインルーチンのフローチャートである。
【図４】エッジ制約処理ルーチンの一部を示すフローチャートである。
【図５】エッジ制約処理ルーチンの一部を示すフローチャートである。
【図６】エッジ制約処理ルーチンの一部を示すフローチャートである。
【図７】  AVPairコピールーチンのフローチャートである。
【図８】レジーリンクの拡張ルーチンのフローチャートである。
【図９】ファクトのコピールーチンのフローチャートである。
【図１０】節の結合ルーチンのフローチャートである。
【図１１】節の移入ルーチンのフローチャートである。
【図１２】エッジの解の獲得ルーチンの一部を示すフローチャートである。
【図１３】エッジの解の獲得ルーチンの一部を示すフローチャートである。
【図１４】エッジの解の獲得ルーチンの一部を示すフローチャートである。
【符号の説明】
３０    コンピュータシステム
４４    光学文字認識ユニット
４８    プロセッサ
【図１】
0004413286.tif 000002
【図２】
0004413286.tif 000003
【図３】
0004413286.tif 000004
【図４】
0004413286.tif 000005
【図５】
0004413286.tif 000006
【図６】
0004413286.tif 000007
【図７】
0004413286.tif 000008
【図８】
0004413286.tif 000009
【図９】
0004413286.tif 000010
【図１０】
0004413286.tif 000011
【図１１】
0004413286.tif 000012
【図１２】
0004413286.tif 000013
【図１３】
0004413286.tif 000014
【図１４】
0004413286.tif 000015