一.List
1.简单介绍
在Prolog,可以使用List的形式来进行数据构造。可以表示任意长度的数据。
List的一般形式,[要素1,要素2,...,要素n]。
要素可以有任意项,包括0。长度为0,就叫空list。
比如:
[w,2,0]
[X,11,[R,5]]
[] #空list
2.List的内部表现
可以看出点'.'表示复合项
下面通过树状图,简单看明其结构。
从树状图我们可以看出,[a]是[b,a]的一部分,[b,a]是[c,b,a]的一部分。
list | 所有 '. '都表示 | 只有表示最外侧 '.' |
[a] | '.'(a,[ ]) | '.'(a,[ ]) |
[b,a] | '.'(b,'.'(a,[ ])) | '.'(b,[a]) |
[c,b,a] | '.'(c,'.',(b,'.'(a,[ ])) | '.'(c,[b,a]) |
推而广之,n项List
'.'(要素1,'.'(要素2,...'.'(要素n,[])...)) 也可以表示成
'.'(要素1,[要素2,...,要素n])
所以List[要素1, 要素2, ..., 要素n] 要和'.'(X,Y) 匹配时,
先将"要素1"匹配到X, Y是除"要素1"以外的全部元素。
注意: '.'(X,Y) 也可写成[X|Y]
[X|[Y|Z]] == [X,Y|Z]
但[X,Y|Z] !=[X,Y,Z] (前list长度2,后为3)
二,读取List
first([X|_],X). #读取要素1
second([_,X|_],X). #读取要素2
读取“要素n”,需要写递归的程序
nth(1,[X|_],X). #描述事实,[X|_]的第一要素是X
nth(N,[_|L],X):-N>1,N1 is N-1,nth(N1,L,X). #定义规则,List [_|L] 的第N个要素是,
N>1时,L的第N-1个要素就是X的话,就表示X
求List长度
len([],0). #描述事实,空list长度为0
len([_|L],N):-
len(L,N1),N is N1+1. #定义规则,list [_|L] 的长度是 ,L 的長度加1的结果。
求List中最大值
max_list([X],X). #描述事实,list最大值为X
max_list([X|L],M):-
max_list(L,M1),M is max(X,M1).
三.制作List
1.List[N, N-1, ..., 2, 1]
rev_range(0,[]). #N是0时空list
rev_range(N,L):- #N为正时,再回归思想
N>0,N1 is N-1,rev_ange(N1,L1),L=[N|L1].
2.List[1, 2, ..., N]
range(I,N,[]):-I>N. #I>N时,是空list
range(I,N,[I|L1]):-I=<N,I1 is I+1,range(I1,N,L1). #I=<N,再回归思想
四.List连结
append(X,Y,Z);-X=[],Z=Y. #X是空list时,Z与Y相等
append(X,Y,Z):-X=[W|X1],append[X1,Y,Z1],Z=[W|Z1]. #X非空,Z是,X1与Y连接后加上开头的W
五.List排序
1.逆序
(1)
reverse([],[]).
reverse([X|L],R):-reverse(L,R1),append(R1,[X],R).
(2)
rev(L,R):-rev(L,[],R).
rev([],R,R).
rev([X|L],Y,R):-rev(L,[X|Y],R).
2.排列组合 permutation
permutation([],[]).
permutation(L,[X|L2]):-del(X,L,L1),permutation(L1,L2).
del(X,[X|L],L).
del(X,[Y|L],[Y|L1]):-del(X,L,L1).
#1.空list排列是空list
#2.不是空的排列,从L删掉的元素X----->L1,L1的排列是L2时,L2的开头添加X,制成list
3,正序
(1)
slow_sort(L,L1):-permutation(L,L1),ordered(L1).
ordered([]). #长度0,正序排列
odered([ ]). #长度1,正序排列
ordered([X,Y|L]):-X=<Y,order([Y|L]).
#长度2以上,开头两个正序的情况下,除了开头以外的部分也 正序,则正序
(2)
- 空リストの整列は空リストです.
- 整列したいリストが [X|L] のとき, まず L を X 未満の要素からなるリスト L1 と, X 以上の要素からなるリスト L2 に分割し, L1 と L2 をそれぞれ整列します. 整列したリストを S1, S2 とすると, S1 と [X|S2] を連結(append)したものが結果のリストです.
六.提出要素
- L が空リストのとき, 答は空リスト.
- L が空リストでないとき,すなわち [X|L1] の形のとき, L1 から正の数だけを選び出したリストを L2 とすると, X が正なら答は [X|L2],そうでないなら答は L2.
https://tamura70.gitlab.io/web-prolog/intro/index.html