渡されたパラメータ、実行する最初のファクトおよび反復タスクを持つサンプルプログラム。反復は再帰によるものです。各リエントリーの前に、特定のパラメーターに関連する値を次のパスのために効果的に更新することができる。
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のコメントで提案されたプログラムを参照してください。
* "...私はプログラムを書くために**持っています..." * - この宿題ですか? – thkala
私は何が問題なのか明確ではない。あなたは私が推測する大学から受け取った問題の完全な記述を私に与えることができますか? ここに正確な問題が何であるかわからない、私はあなたに答えを与えることはできませんが、ここで私はすでに与えられた答えであなたと非常に似た問題を発見しましたhttp://www.informatik.uni-freiburg.de/~ki/ teaching/ws0708/logic/prolog7.pdf、スライド17th以降 – matcheek