3

バックグラウンド

整数係数のリストを使用して、(X の) 多項式を表すことができます。たとえば、1 + 3x + 3x^2 + 2x^3 は [1,3,3,2] で表されます。

P をこれらのリストの 1 つとします。

これらの係数を使用してさまざまなことを行う公理を作成する必要があります。

例:関係 eval(P,A,R) の公理 ここで、R は P によって表される多項式を X = A で評価した結果です (P と A が完全にインスタンス化されることを期待してください)。たとえば、eval([3,1,2],3,R) は R=24 を生成します。(これは、3(3)^0 + 1(3)^1 + 2(3)^2 = 3 + 3 + 18 = 24 であるためです)。

このProlog チュートリアルでは、リストを再帰的に検索する方法について説明します。「何かがリストの最初の項目であるかどうかを確認します。そうであれば成功します。そうでない場合は、リストの最初の項目を破棄して残りを調べます」 .

on(Item,[Item|Rest]).  

on(Item,[DisregardHead|Tail]):-

      on(Item,Tail).

質問

このコードはどのようにしてリストの最初の項目を破棄しますか?

問題は、それを見つけたら、それをどのように使用して上記のように計算するかということになります。

4

2 に答える 2

3

このコードはどのようにしてリストの最初の項目を破棄しますか?

リストの末尾で再帰的に呼び出すとon、最初の要素が無視されます。_また、使用しないため、代わりに呼び出す必要がありますDisregardHead(一部のコンパイラは、「シングルトン変数」について警告します)。

それを見つけたら、それを使用して上記のように計算するにはどうすればよいですか?

さて、あなたの目標はリスト全体を考慮に入れた単一のon結果を持つことですが、複数の結果を返すことになっています-各試合に1つ。したがって、最初の要素を無視するのではなく、結果に組み込む必要があります。例:

my_pred([],0).
my_pred([Item|Tail],Result) :-
    my_pred(Tail,IntermResult),
    combine(Item,IntermResult,Result). % Ex.: Result is Item + IntermResult

まだ学習中のようですので、完全なコードは提供していませんが、それが必要な場合は実行できます。これも非常に単純な例であり、最適化されていません (つまり、末尾再帰はありません)。

追加のヒント: 多項式をこのように表現すると、再帰計算がどのように行われるかが明らかになるはずです。

1 + x * (3 + x * (3 + x * (2 + x * 0)))
于 2013-02-24T00:53:07.823 に答える
2

SWI-Prolog の guitracer を使用して単純な Prolog プログラムを直感的に理解する方法を示す 90 秒のビデオを作成しました。Ubuntu/Debian では、実行するだけで、ビデオのコマンド ( 、(ファイルのロード)、、およびクエリ)sudo apt-get install swi-prologを使用してデバッガーを自分で試すことができます。swipl[filename]guitracer.trace.

SWI-Prologのギトレーサーを使う

テキストが読めない場合は、画像を右クリックして [画像を表示] (Firefox) を選択します。

于 2013-02-24T01:40:04.257 に答える