gpt4 book ai didi

recursion - 创建交错元素列表 : Prolog

转载 作者:行者123 更新时间:2023-12-04 17:42:53 24 4
gpt4 key购买 nike

我正在定义一个函数alternate_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)

这是我迄今为止尝试过的,
alternate_func([[], L], L).          
alternate_func([[H|T], []], [H|T]).

alternate_func([[X|L1], [Y|L2]], [X,Y|L3]) :-
alternate_func([L1, L2], L3).

我在案例 1 中得到了正确的结果,但在 2,3 和 4 中失败了。这里有什么问题?

最佳答案

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

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

  • 代码:
    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).

    关于recursion - 创建交错元素列表 : Prolog,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55795221/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com