我一直在尝试了解如何从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.