1

理論的には理解できる比較的単純な割り当てがありますが、それをコードに組み込むのに十分なPrologの構文を完全には理解していないと思います。基本的に、Cでの操作を表す英語表記のリストがあります。それらは、Prologプログラムに渡されるときにリストとして保存されます。例えば:

add 4 to 3

[add, 4, to, 3]

そのリストを受け取り、同等のものを返す関数を作成する必要があります。だから私が電話したら

english2C([add,4,to,3], C).
C = 4+3

Cを結果にバインドします。したがって、データ構造自体は+(4(3))のようになります。翻訳しなければならないそのような英語表記のリストがあるので、それは有限の数です。すべての可能性を説明しなければならないわけではありません。組み合わせもあり、2つの操作を取り、それらを組み合わせます(間にコンマを入れて)

english2C([add,3,to,5,',',then,subtract,7], C).
C = 3+5-7

どうやって始めたらいいのか少し混乱しています。リストの最初の要素を取得でき、それは常に演算子(+、-、*など)になることを知っています。その後、リストを再帰的に調べてオペランドを探すことができます。問題は、「3を5に加算してから、4を掛ける」など、演算の順序が必要な場合です。これは、(3 + 5)* 4として表す必要がありますが、直接変換すると3 + 5*4になります。 。

ああ、それを逆方向に実行できるかどうかを確認する必要があります(Cステートメント(3 + 5)を指定し、英語に翻訳し直します(3を5に追加))。その部分は、私にはまったく考えがありません。

編集:すべてにパターンマッチすることはできないほど、可能な英語表記の順列が十分にあります。私がする必要があるのは、最初の演算子を対応する算術記号と照合してから、オペランドを見つけることだと思います。組み合わせステートメントの場合、それが最初の部分になり(したがって、3 + 5になります)、その後にコンマが続き、次のステートメントが続きます。ちなみに、組み合わせステートメントは好きなだけ長くすることができるので、2つのステートメントだけではなく、完了です。

4

1 に答える 1

2

パターンの数がかなり少ない場合は、次のようにすることができます。

english2C([add,X,to,Y], R) :- R is X+Y.
english2C([add,A,to,B,',',then,subtract,C], R) :- R is A+B-C.

編集

上記のルールは値を計算します。翻訳するために、DCGをマッチングに使用できます。これは「逆方向」にも機能します。

english2C(In, R) :- phrase(toe(R), In, []).

toe(X+Y) --> [add,X,to,Y].
toe(X*Y) --> [multiply,X,by,Y].
toe(L-R) --> toe(L), [',',then,subtract,R].

テスト:

?- english2C(X,3+6).
X = [add, 3, to, 6].

編集申し訳ありませんが、カットを忘れました。それを追加すると、

?- english2C([add,3,to,5,',',then,subtract,4],X).
X = 3+5-4.

?- english2C(L,3+5-4).
L = [add, 3, to, 5, ',', then, subtract, 4].

なしでは、;の後にループがあります。

?- english2C([add,3,to,5,',',then,subtract,4],X).
X = 3+5-4 ;
^CAction (h for help) ? goals
[698,875] toe(_G2096630, [add, 3, to, 5, ',', then, subtract, 4], _G2096652)
[698,874] toe('<garbage_collected>', '<garbage_collected>', _G2096652)
...

それは一点の変化です:あなたはそれを自分で見つけることを好みますか?

于 2012-11-06T18:55:24.180 に答える