在prolog中列出连续的对
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在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).
答案
首先,让我们考虑以下几点:
- 对的清晰表示很重要。
不要使用“逗号列表”
[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 ...
工作就像它应该™。
家庭作业:使用其他答案中提出的代码重新运行上面的查询!
另一答案
学习递归是必不可少的,所以请选择damianodamiano。然后考虑基本的“所有解决方案”工具,比如findall / 3:
?- L=[1,2,3],findall([X,Y],append(_,[X,Y|_],L),Ps).
L = [1, 2, 3],
Ps = [[1, 2], [2, 3]].
另一答案
只需写:
pair([_],[]).
pair([A,B|T],[[A,B]|T1]):-
pair([B|T],T1).
查询:
?-pair([1,2,3],L).
L = [[1, 2], [2, 3]]
你不需要使用append/3
。
以上是关于在prolog中列出连续的对的主要内容,如果未能解决你的问题,请参考以下文章