我想构建一个列表列表,以相互交织到一个列表,如: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]).我一直在努力解决这个问题,但都失败了.我应该如何将单个列表返回到包含相同长度的每个子列表?非常感谢!
:- use_module(library(clpfd),[transpose/2]).
connsx(Xss, Xs) :-
transpose(Xss, XssT),
append(XssT, Xs).
Run Code Online (Sandbox Code Playgroud)
您遇到的问题是这个谓词子句:
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)
这个解决方案确实留下了一个选择点,如果您愿意的话,我将把它作为一个练习来消除。