在prolog中列出连续的对

时间:2017-12-24 14:01:09

标签: list prolog

我想列出给定列表中的连续对,例如
给定[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).

3 个答案:

答案 0 :(得分:2)

学习递归是必不可少的,所以请选择damianodamiano的回答。然后考虑基本的“所有解决方案”工具,例如findall / 3:

?- L=[1,2,3],findall([X,Y],append(_,[X,Y|_],L),Ps).
L = [1, 2, 3],
Ps = [[1, 2], [2, 3]].

答案 1 :(得分:2)

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

  • 的干净表示很重要。

    • 使用“逗号列表”[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 ...

就像它应该的那样工作。

家庭作业:使用其他答案中提出的代码重新运行上面的查询!

答案 2 :(得分:1)

简单地写一下:

pair([_],[]).
pair([A,B|T],[[A,B]|T1]):-
    pair([B|T],T1).

查询:

?-pair([1,2,3],L).
L = [[1, 2], [2, 3]]

您不需要使用append/3