0

私はプロローグに不慣れで、水差しについてのプログラムを書かなければなりません。私の問題は、水差しの初期状態とクエリの形成に関するものです。クエリの形式は次のとおりです。

?- myPredicate(args), filled(j1,1)

意味j1は1ガロンの水で満たされています。j1は水差しの1つを表します。もう1つはj2です。最初に、私は持っています

filled(j1,0) 
filled(j2,5) 
capacity(j1,2) 
capacity(j2,5) 

以下の情報を提供していただければ幸いです。

質問A:プログラム内でj1の初期状態を宣言する必要がありますか?filled(j1,0)

質問B:プログラムにfilled(j1,1)の解決策を見つけさせる必要があります。そのために私はいくつかのアイデアを持っていますが、私が確信していないのは、クエリとからfilled(J、Volume)を更新する方法 myPredicateです。

私は初期状態を持っているので非常に混乱しています、filled(j1,0)そして今私はでを作成しなければなりませfilled(j1,1)myPredicate。したがって、何らかの形式のfilled(J,Volume)inが必要なmyPredicateので、クエリはfalseではなくtrueを返します。

上記のクエリを実行したときに正しい答えを表示できるように、filled(J,Voume)内部に組み込むにはどうすればよいですか?myPredicate

4

1 に答える 1

-2

渡されたパラメーター、初期ファクト、実行する反復タスクを含むサンプル プログラム。反復は再帰によって行われます。各再エントリの前に、特定のパラメータに関連する値を次のパスのために効果的に更新できます。

my_loop(N) :- N > 10.

my_loop(N) :- N =< 10,
    write(N), nl,
    Nextin is N + 1,
    my_loop(Nextin).

:- my_loop(1).

A:
与えられた情報 (事実) はプログラムに必要です。それらは、キーボード入力から、いくつかの述語への初期引数として、またはあなたが提案したデータベース内の事実として利用できるようにすることができます。また、特別な状況でのみ提案されますが、ファクトは何らかの述語またはルールにハードコーディングできます。

以下と上記は、初期情報をパラメーターとして渡す例です: :- my_predicate(args...).

事実がたくさんある場合は、データベースが最適です。毎回変更する必要があるいくつかの事実は、キーボードから取得するのが最適です。それ以外の場合は、おそらく問題ではありません。

:- my_predicate([fill(j1,0),fill(j2,5)], Answer),
    write(Answer),
    nl.

B:

my _ループの例 を参照してください。

my_loop では、[1..10] を数えるタスクが反復的に解決されます。与えられたもの: 1 がパラメーターとして渡されます。これは主に、プログラムが同じことを何度も行うためです
。 1. 数値 (N) を取ります。大きすぎる場合はやめてください。そうでなければ...
2.印刷します。
3. 次の数 (N+1) を計算します
4. 繰り返し ます

10 はハードコーディングされています。それは事実だったかもしれません: stop_after(10).

これで、操作するデータ、my_loop の変数N、および myPredicate の { j1,j2 }を実際に何度も再割り当てする必要がなくなりました: my_loop を参照してください。同じことをもう一度行うときは、計算を再入力するだけですが、異なるパラメーターを使用します。

cap(j1,2).
cap(j2,5).

my_predicate(Status, Answer) :-
    got_juice(Status,0),
    Answer=Status.

%%% Instead of changing values, rerun comp. with new values
%%% based on a computation made from the old ones.
my_predicate([filled(j1,J1), filled(j2,J2)], Answer) :-
    Used is J1 + J2,
    got_juice(Used, J), J \= 0,
    cap(j1,C1), cap(C2),
    %% Use cap and filled to add more to filled..
    NextJ1 is J1 + ...,
    NextJ2 is J2 + ...,
    my_predicate(filled(j1,NextJ1), filled(..., Answer).

注:
上記の述語は、"myProgaram" のパラメーターを使用して、Prolog での反復を示すためのものです。実際の実装については、matcheek からのコメントで提案されているプログラムを参照してください。

于 2010-12-17T09:53:48.743 に答える