你能用纯序言写 between/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.
如果使用cut,可以防止最终搜索失败,并恢复确切的内置 between/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.
这篇关于你能用纯序言写 between/3 吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!