您能在纯序言中写在/3之间吗? [英] Can you write between/3 in pure prolog?
问题描述
我一直在尝试了解如何从Prolog谓词中产生一系列回溯值.内置谓词between/3
将在回溯时一次生成一个范围内的所有整数,因此,如何编写该整数的示例可能会帮助我完成任务.
I've been trying to understand how to produce a series of values from a Prolog predicate on backtracking. The builtin predicate between/3
will generate all the integers in a range one at a time on backtracking, so an example of how that is written may help me with my task.
我在现有的Prolog系统中寻找实现,但是GNU Prolog的between/3
实现是一个C函数,诀窍在于它调用了另一个C函数"Pl_Create_Choice_Point",从而允许它产生附加值回溯中.
I looked for an implementation in an existing Prolog system, but the implementation of between/3
for GNU Prolog is a C function, and the trick there is that it calls another C function "Pl_Create_Choice_Point" which allows it to produce additional values on backtracking.
推荐答案
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行为之间的精确内建:
If you use a cut, you can prevent the final search failure, and recover the exact builtin between/3 behavior:
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.
这篇关于您能在纯序言中写在/3之间吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!