2010-12-16 29 views
0

私はプロローグには新しく、水に関するプログラム ジャグを書く必要があります。私の問題は、ジャグとクエリ フォーメーションの初期状態に関するものです。クエリの形式は次のとおりです。Prologの質問の質問

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

意味1には1ガロンの水が入っています。 j1はジャグの1つを表す。もう1つはj2です。 Initally、私が持っている

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

次の情報を私に提供する場合、私は本当に感謝される:

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

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

私は初期状態filled(j1,0)を持っているので、私は非常に混乱していますし、今 私はfilled(j1,1)myPredicateでを作成する必要があります。だから、filled(J,Volume)という形式をmyPredicateに入れておくべきです。そうすれば、クエリはfalseの代わりにtrueを返します。

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

+2

* "...私はプログラムを書くために**持っています..." * - この宿題ですか? – thkala

+1

私は何が問題なのか明確ではない。あなたは私が推測する大学から受け取った問題の完全な記述を私に与えることができますか? ここに正確な問題が何であるかわからない、私はあなたに答えを与えることはできませんが、ここで私はすでに与えられた答えであなたと非常に似た問題を発見しましたhttp://www.informatik.uni-freiburg.de/~ki/ teaching/ws0708/logic/prolog7.pdf、スライド17th以降 – matcheek

答えて

-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_loopで

は、[1..10]カウントのタスクは、繰り返し解かれる:

_ ループ例を参照してください。 givens:1は、主に プログラムが同じことを繰り返し実行するため、パラメータとして渡されます。
1.数値(N)を取ります。それが大きすぎる場合は終了してください。そうでなければ...
2.それを印刷します。
3.リピート

10がハードコーディングされて、次の数(N + 1)
4を計算します。それは事実かもしれません:stop_after(10)

次に操作すべきデータ、my_loop可変N、及び {J1は、J2} myPredicateでは、実際には再び過剰とオーバー再割り当てする必要がない。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 "実際の実装では、matcheekのコメントで提案されたプログラムを参照してください。

+0

-1宿題に関する詳細な回答。 –