Prolog,我应该如何构建列表到单个列表?

Yi *_*tin 5 prolog

我想构建一个列表列表,以相互交织到一个列表,如:coon([[1,4],[2,5],[3,6]],X)应该返回X = 1,2, 3,4,5,6.并且有一个条件,每个子列表应该只有相同的长度,否则,它应该失败,如[[q,r,y],[a,e],[c,g,t],X] shouid失败,和浣熊([A,B,C],[q,w,e,r,t,y])应该只返回一个解,即A = [q,r],B = [w,t],C = [E,Y].我最近的做法是.

  conns([],[]).
  conns([[Head|Tail]|X],[Head|Y]):-
    append(X,[Tail],X2),
    conns(X2,Y).                                                

conns([[]|T],A):-
    conns(T,A).
Run Code Online (Sandbox Code Playgroud)

当我尝试浣熊时,它给了我多种解决方案([A,B,C],[q,w,e,r,t,y]).我一直在努力解决这个问题,但都失败了.我应该如何将单个列表返回到包含相同长度的每个子列表?非常感谢!

fal*_*lse 5

:- use_module(library(clpfd),[transpose/2]).

connsx(Xss, Xs) :-
   transpose(Xss, XssT),
   append(XssT, Xs).
Run Code Online (Sandbox Code Playgroud)

  • 这个程序仍然可以通过终止改进!特别是第二个参数目前对终止没有影响. (2认同)

lur*_*ker 4

您遇到的问题是这个谓词子句:

conns([[]|T],A):-
    conns(T,A).
Run Code Online (Sandbox Code Playgroud)

这使得解决方案比您想要定义的更通用。具体来说,如果我正确理解问题,则第一个参数conns应该始终是一个列表,其元素都是长度相等的列表。这意味着 if[[]|T]是第一个参数并且您期望conns([[]|T], A)成功,那么T也应该看起来像[[]|R]or []。也就是说,它应该是一个空列表(可能是空的)列表。

如果您根据此约束修改空列表情况,您的解决方案将起作用:

% The case where the first argument consists of non-empty lists    
conns([[Head|Tail]|X], [Head|Y]):-
    append(X, [Tail], X2),
    conns(X2, Y).

% Base case in which first argument is a list of empty lists
conns([], []).
conns([[]|T], []) :-
    conns(T, []).
Run Code Online (Sandbox Code Playgroud)

现在,当您运行查询时,您会得到以下结果:

| ?- conns([[1,4],[2,5],[3,6]], R).

R = [1,2,3,4,5,6] ? ;

no
| ?-
Run Code Online (Sandbox Code Playgroud)

也:

| ?-  conns([A,B,C], [q,w,e,r,t,y]).

A = [q,r]
B = [w,t]
C = [e,y] ? a

no
| ?-
Run Code Online (Sandbox Code Playgroud)

这个解决方案确实留下了一个选择点,如果您愿意的话,我将把它作为一个练习来消除。