Prolog:list处理(复习笔记)

一.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)したものが結果のリストです.

 

六.提出要素

  1. L が空リストのとき, 答は空リスト.
  2. L が空リストでないとき,すなわち [X|L1] の形のとき, L1 から正の数だけを選び出したリストを L2 とすると, X が正なら答は [X|L2],そうでないなら答は L2.

https://tamura70.gitlab.io/web-prolog/intro/index.html

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值