创建交错元素列表:Prolog

Kat*_*ine 5 recursion prolog

我正在定义一个函数alter_func(Ps,P),其中Ps是列表的列表,P是Ps中所有元素的列表,其行为如下:

?- alternate_func([[p,q],[r,s]],P). 
P=[p,r,q,s]. (case 1)

?- alternate_func([P,Q,R],[p,q,r,s,t,u]). 
P=[p,s], Q=[q,t], R=[r,u]. (case 2)

?- alternate_func([Q],[1,2,3]). 
Q=[1,2,3]. (case 3)

?- alternate_func([[4,5,6],[3,1],[4,1,2]],X).
false. (because Length of sublists must be same) (case 4)
Run Code Online (Sandbox Code Playgroud)

到目前为止,这是我尝试过的

alternate_func([[], L], L).          
alternate_func([[H|T], []], [H|T]).  

alternate_func([[X|L1], [Y|L2]], [X,Y|L3]) :-
    alternate_func([L1, L2], L3).
Run Code Online (Sandbox Code Playgroud)

对于情况1,我得到了正确的结果,但是对于2,3和4,我却失败了。这是什么问题?

gus*_*bro 5

此解决方案处理列表列表,将头/尾分开。然后:

  • 如果所有的尾巴都是空的,我们就完成了。
  • 否则,将再次使用尾巴重复该过程。

码:

lists_interleaved( Ess, Es):-
  lists_interleaved( Ess, X-X, Es).

lists_interleaved( [], Head-[], []):-
  maplist(=([]), Head).
lists_interleaved( [], [First|Head]-[], Es):-
  lists_interleaved( [First|Head], X-X, Es).
lists_interleaved( [[E|ETail]|Ess], Head-[ETail|Rest], [E|Es]):-
  lists_interleaved( Ess, Head-Rest, Es).
Run Code Online (Sandbox Code Playgroud)

  • @Katherine`XX`与`-(X,X)`相同于`p(X,X)`或`q(X,X)`等,具有任意名称`-`,`p `,`q`或其他。它只是一个包含两个参数的复合术语,用中缀符号表示。 (2认同)