我有一个序言作业,要求我们列出两个给定范围内的所有数字对。我可以让它输出(使用一个函数)以下内容,但我不知道如何合并所有输出。这是调用函数的输出:
?- i(L,5,7).
L = [(5, 5), (5, 6), (5, 7)] ;
L = [(6, 5), (6, 6), (6, 7)] ;
L = [(7, 5), (7, 6), (7, 7)] ;
这是代码(间隔方法是教授定义的,不允许修改):
interval(X,L,H) :-
number(X),
number(L),
number(H),
!,
X>=L,
X=<H.
interval(X,X,H) :-
number(X),
number(H),
X=<H.
interval(X,L,H) :-
number(L),
number(H),
L<H,
L1 is L+1,
interval(X,L1,H).
i(L,X,Y):-
interval(N2,X,Y),
setof((N2,N),interval(N,X,Y),L).
我正在寻找这样的输出:
L = [ (5, 5), (5, 6), (5, 7), (6, 5), (6, 6), (6, 7), (7, 5), (7, 6), (7, 7)]
最佳答案
问题在于:
i(L,X,Y):-
<b>interval(N2,X,Y),</b>
setof((N2,N),interval(N,X,Y),L).
将首先将N2
设置为区间中的一个数字,然后您要求为该给定数字生成一个集合N2
和一个变量号 N
.
然而,您可以简单地在 setof/3
的目标中定义一个复合:
i(L,X,Y) :-
setof((N2,N),<b>(interval(N2,X,Y),</b>interval(N,X,Y)<b>)</b>,L).
不过,也许更优雅的方式(可能更 Prolog)是定义一个 interval_tuple/3
谓词:
interval_tuple(X,Y,(N,N2)) :-
interval(N,X,Y),
interval(N2,X,Y).
然后在那个谓词上调用你的 setof/3
或 listof/3
:
i(L,X,Y) :-
listof(Tup,interval_tuple(X,Y,Tup),L).
关于将输出合并到 Prolog 中的一个列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42166989/