Merge 在Prolog中将输出合并到一个列表中

Merge 在Prolog中将输出合并到一个列表中,merge,prolog,Merge,Prolog,我有一个序言作业,要求我们列出两个给定数范围内的所有数字对。我可以让它输出(使用一个函数)如下,但我不知道如何合并所有的输出。下面是调用该函数的过程: ?- 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)] ; 下面是代码(间隔方法是prof定义的,不允许修改): 问题在于: i(L,X,Y):- interval(N2,X

我有一个序言作业,要求我们列出两个给定数范围内的所有数字对。我可以让它输出(使用一个函数)如下,但我不知道如何合并所有的输出。下面是调用该函数的过程:

?- 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)] ;
下面是代码(间隔方法是prof定义的,不允许修改):

问题在于:

i(L,X,Y):-
    interval(N2,X,Y),
    setof((N2,N),interval(N,X,Y),L).
尽管如此,一种更优雅的方法(可能是一种更简洁的序言)可能是定义一个
interval\u tuple/3
谓词:

interval_tuple(X,Y,(N,N2)) :-
    interval(N,X,Y),
    interval(N2,X,Y).
i(L,X,Y) :-
    listof(Tup,interval_tuple(X,Y,Tup),L).
然后调用该谓词上的
setof/3
listof/3

interval_tuple(X,Y,(N,N2)) :-
    interval(N,X,Y),
    interval(N2,X,Y).
i(L,X,Y) :-
    listof(Tup,interval_tuple(X,Y,Tup),L).

您可以通过CLP(FD)简洁地执行此操作:

:-使用_模块(库(clpfd)]。
间隔(左,右,(X,Y)):-%一个间隔的定义
[X,Y]ins向左。。正确的,
标签([X,Y])。
间隔(左、右、间隔列表):-
左#=<右,
标签([左,右]),
findall(间隔,间隔(左,右,间隔),间隔列表)。%查找所有间隔

我使用的是更具描述性的名称,
interval/3
,而不是简单的
I/3
。我还重新排列了一些参数。

谢谢!我猜我的睡眠不足的大脑忽略了一些简单的事情。不确定你是否应该调用
(X,Y)
一个元组。它是(好的,它是
,'(X,Y)
),但是
(X,Y,Z)
不是Python或Haskell中的“元组”,例如(因为它是
,'(X',,'(Y,Z))
,而不是
,'(X,Y,Z)
。@Boris但实际上你不能把
[1,2]
称为列表,它是
(1,;(2,[])
。Prolog中不存在“真实的数据结构”。Prolog是非类型化的,所以它意味着数据结构只存在,因为程序员说它们存在。我不想说教,只是指出你永远不会在库代码中看到
(X,Y)
。它将是
X-Y
(一对),或
点(X,Y)
,依此类推。另外:序言是一个“列表”,更容易说它不是一个“数组”,也许。。。。至于类型和数据结构,在你评论的最后一句话中有很多不一致的地方,但它与要点无关:-)在C中,你使用
struct
s和指针来创建数据结构。在Prolog中,您使用术语来创建数据结构。开始宣称Prolog中没有列表或数据结构有点不公平。这就好比说循环不存在,因为它只是有条件的GOTO。使用而不是
:-Use_module(library(clpfd))。
i(L,X,Y) :-
    listof(Tup,interval_tuple(X,Y,Tup),L).
:- use_module(library(clpfd)]).

interval(Left, Right, (X,Y)) :-   % Definition of one interval
    [X, Y] ins Left .. Right,
    label([X, Y]).

intervals(Left, Right, IntervalList) :-
    Left #=< Right,
    label([Left, Right]),
    findall(Interval, interval(Left, Right, Interval), IntervalList). % Find all intervals