理論的には理解できる比較的単純な割り当てがありますが、それをコードに組み込むのに十分な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つのステートメントだけではなく、完了です。