我一直在尝试了解如何从Prolog谓词中产生一系列回溯值。内置谓词between/3会在回溯时一次生成一个范围内的所有整数,因此,如何编写该整数的示例可能会对我的任务有所帮助。

我在现有的Prolog系统中寻找实现,但是GNU Prolog的between/3实现是一个C函数,诀窍在于它调用了另一个C函数“ Pl_Create_Choice_Point”,这使它可以在回溯时产生附加值。

最佳答案

bet(N, M, K) :- N =< M, K = N.
bet(N, M, K) :- N < M, N1 is N+1, bet(N1, M, K).


实际上:

$ swipl
?- [bet].
% bet compiled 0.00 sec, 1,064 bytes
true.

?- bet(1,5, K).
K = 1 n
K = 2 n
K = 3 n
K = 4 n
K = 5 n
false.


如果使用剪切,则可以防止最终搜索失败,并恢复/ 3行为之间的精确内建关系:

bet(N, M, K) :- N < M, K = N.
bet(N, M, K) :- N == M, !, K = N.
bet(N, M, K) :- N < M, N1 is N+1, bet(N1, M, K).


实际上:

?- [bet].
% bet compiled 0.00 sec, 416 bytes
true.

?- between(1,5,K).
K = 1 n
K = 2 n
K = 3 n
K = 4 n
K = 5.

?- [bet].
% bet compiled 0.00 sec, 240 bytes
true.

?- bet(1,5,K).
K = 1 n
K = 2 n
K = 3 n
K = 4 n
K = 5.

09-11 17:55