4

プロローグと定詞の文法を理解しようとしていますが、両方を理解するのに非常に苦労しています。

私は本当にdcg構文の使用方法を理解しようとしています...

ここに2つの例があります:

1つ目は、実際にはこのフォーラムの別の質問からのコードですが、追加の質問があります:

コードは次のようになります。

s --> first, operator, second.
first --> [X].
operator --> ['+'].
second --> [X].

そして、プロローグがこれについて尋ねられると、それはtrue / falseを返しますが、これを実際に変更して値を「バインド」する方法を理解することはできません.s(X、[2、+、2] ,[]))。それは最初の値を返すので、true を返す代わりに X = 2 と言うでしょう。

とにかく、実際の質問に戻ります。通常のプロローグにはいくつかのルールがあり、これはその 1 つです。実際には何もしません。単に例として作成されたものです。

do(X, Y, [H|T], Sum):-
    H == 1, %check if H is 1
    X = H,
    Y = T,
    Additional is H+5,
    Sum is Additional+Additional.

基本的に、DCG の基本的な構文を試して理解できるように、誰かがこれを DCG に翻訳できるかどうかを尋ねています! いくつかのチュートリアルを読んでみましたが、賢くなっていないように感じます...

4

2 に答える 2

3

DCG: foo(A1, A2, A3, ... , An) --> バー.

プロローグ: foo(A1, A2, A3, ... , An, X, Y) :- bar(X,Y)

したがって、次のsように変更する必要があります。

s(X) --> first(X), operator, second.
first(X) --> [X].
operator --> ['+'].
second --> [X].

もちろん、実際の結果を返すほうがよい場合もあります。これを行うには、次のように行われる DCG 句でプロローグ コードをカプセル化する必要があります{}

s(Z) --> first(X), operator, second(Y), {Z is X+Y}.
first(X) --> [X].
operator --> ['+'].
second(X) --> [X].

(当然、演算子が増えると、プロローグ コードはそれほど単純ではなくなります)。

述語に関しては、次のdo/4ようにする必要があります。

do(X,Y,[H|T],Sum) -->
   {H == 1, %check if H is 1
    X = H,
    Y = T,
    Additional is H+5,
    Sum is Additional+Additional}.

しかし、なぜあなたがそれを望むのかわかりません。

最後のヒント: phrase/3DCG 述語に最後の 2 つの引数を追加する代わりに使用することをお勧めします。

于 2012-12-16T15:57:59.633 に答える
1

do/4 を意味のある方法で DCG に変換するのは簡単ではありません。DCGの隠し引数を「コピー」する引数を削除しました。

do(Sum) -->
    [1],  %check if H is 1
    {  % braces allow 'normal' Prolog code (but we have no access to 'hidden' arguments)
    Additional is H+5,
    Sum is Additional+Additional
    }.

編集申し訳ありませんが H を忘れてしまいましたAdditional is H+5,。お読みくださいAdditional is 1+5,...

于 2012-12-16T18:33:18.380 に答える