gpt4 book ai didi

list - 在序言中列出连续对

转载 作者:行者123 更新时间:2023-12-03 21:36:54 25 4
gpt4 key购买 nike

我想从给定的列表中列出连续的对,例如
给定 [1,2,3] 它返回 X=[[1,2],[2,3]]
我对递归有点困惑。
我尝试了上面的代码,它返回了对(一次一个)但是附加不起作用。

pair_list([X,Y|_], [X,Y]):- 
append([[X,Y]],[,],L),
write(L).

pair_list([_|Tail], XY):-
pair_list(Tail,XY).

最佳答案

首先,让我们考虑以下几点:

  • 对的清晰表示很重要。

    • 不要使用“逗号列表”[A,B] 或“逗号对”(A,B)

    • 改为使用 A-B 形式的复合词。

  • 坚持使用 Prolog 的逻辑纯子集以获得最大的代码通用性。

一个简单的实现是这样的:

list_adjitems([], []).
list_adjitems([E|Es], Xs) :-
list_adjitems_previous(Es, Xs, E).

list_adjitems_previous([], [], _). % auxiliary predicate
list_adjitems_previous([E1|Es], [E0-E1|Xs], E0) :-
list_adjitems_previous(Es, Xs, E1).

一些示例查询:

?- list_adjitems([], Xs).
Xs = [].

?- list_adjitems([a], Xs).
Xs = [].

?- list_adjitems([a,b,c], Xs).
Xs = [a-b,b-c].

这是否也适用于“反向”方向? (提示:确实如此。)

?- list_adjitems(Es, []).
Es = []
; Es = [A].

?- list_adjitems(Es, [x-y,y-z,z-u,u-v]).
Es = [x,y,z,u,v].

最后,我们不要忘记最一般的查询:

?- list_adjitems(Es, Xs).
Es = [] , Xs = []
; Es = [A] , Xs = []
; Es = [A,B] , Xs = [A-B]
; Es = [A,B,C] , Xs = [A-B,B-C]
; Es = [A,B,C,D] , Xs = [A-B,B-C,C-D]
; Es = [A,B,C,D,E] , Xs = [A-B,B-C,C-D,D-E]
; Es = [A,B,C,D,E,F] , Xs = [A-B,B-C,C-D,D-E,E-F]
; Es = [A,B,C,D,E,F,G], Xs = [A-B,B-C,C-D,D-E,E-F,F-G]
… % ... and so on ...

工作正常™。

家庭作业:使用其他答案中建议的代码重新运行上述查询!

关于list - 在序言中列出连续对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47961215/

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