渡されたパラメーター、初期ファクト、実行する反復タスクを含むサンプル プログラム。反復は再帰によって行われます。各再エントリの前に、特定のパラメータに関連する値を次のパスのために効果的に更新できます。
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 からのコメントで提案されているプログラムを参照してください。