带有传入参数、初始事实和要执行的迭代任务的示例程序。迭代是通过递归进行的。在每次重新进入之前,与某个参数相关的值可以有效地更新以用于下一次传递。
my_loop(N) :- N > 10.
my_loop(N) :- N =< 10,
write(N), nl,
Nextin is N + 1,
my_loop(Nextin).
:- my_loop(1).
答:
程序需要给定的信息(事实)。它们可以从键盘输入中获得,作为某些谓词的初始参数,或者作为您建议的数据库中的事实。此外,仅建议在特殊情况下,可以将事实硬编码为某些谓词或规则。
下面和上面是将初始信息作为参数传递的示例::- my_predicate(args...)
.
如果有很多事实,数据库是最好的。每次都需要更改的一些事实最好从键盘获取。否则,它可能无关紧要。
:- my_predicate([fill(j1,0),fill(j2,5)], Answer),
write(Answer),
nl.
乙:
请参阅我的_循环示例:
在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).
注意:
上面的谓词只是为了演示 Prolog 中的迭代,使用“myProgaram”的参数。有关实际实现,请参阅 matcheek 评论中建议的程序。