3

Prolog の自然言語に関する次の演習があります。

次の 2 つの演算子hasofを次のようなフレーズで実装します: peter has car of john次のような質問に答えます: Who has What of X

英語では「ピーターはジョンの車を持っている」と言いますが、私はイタリア人なので、イタリア語のリクエストを英語に翻訳しようとしました. ただし、コンセプトが明確であることを願っています。

そこで、ファイルに保存された次の Prolog ソリューションを見つけました。

:-op(200,xfx,has).
:-op(100,xfx,of).

peter has car of john.

その後、Prolog シェルでこのファイルを参照すると、次の操作を実行できます。

?- ピーターはジョンの車を持っています。

真実。

または:

?- X には Z の Y があります。

X =ピーター、

Y = 車、

Z = ジョン。

うまくいきましたが、どのように機能するのかよくわかりません。オペレーターの優先順位についていくつか質問があります。

演算子には優先度値として 200 がありますof operator の優先値は 100です。

次のフレーズを参照する: peter has car of johnということは、Prolog が最初に文のこの部分を評価することを意味します: car of john (演算子の優先順位が低いため、respect has operator) が真の場合、次のように評価します: pater has (前回評価結果)

一言で言えば、原文を次のように解釈できます。

ピーター・ハズ(ジョンの車)

それが正しいか?

別の質問は、オペレーターの類型に関連しています。

私の解決策では、両方の演算子にxfx類型論を使用します。この種の文では、複数の演算子が同じ優先順位を持つ潜在的なあいまいさに関連する問題がないためです (例: a - b - cで演算子 - が必要です)。形式yfx )

私の質問は次のとおりです: has および of 演算子で何らかの方法で xfy および yfx 混合を使用して同じ結果を得ることができますか?

4

1 に答える 1

4

それが正しいか?はい。

xfxは、同じ優先度の式の連鎖を可能にするという意味でxfy、演算子がその分岐を「支配する」ことを意味しますがyfx、「リスト構築」を意味します。

あなたのフレーズでは、正しい op 宣言を使用していますが、必要に応じて他の結合指定子を使用することもできます。

of「ピーターはジョン・オブ・メアリーの車を持っている」のように、xfy for を使用する可能性があると思います。後

:- op(100, xfy, of).
:- op(200, xfx, has).

私は得る

?- write_canonical(peter has car of john of mary).
has(peter,of(car,of(john,mary)))
true.
于 2013-03-28T18:31:41.610 に答える