2014-05-03 78 views
1

在此任务中遇到一些问题。获取Prolog中列表的第二个元素

目前我已经试过这个,我知道这是错误的,因为我不知道如何将L分成它的头部和尾部,但是这是我要去做的想法。

second(L,E) :- [H | E | T] 

我认为,E必须在头后面,使它成为第二个元素。不过,我对这种语言很陌生,并希望得到一些见解。我如何从写出谓词的方式得到这个头和尾。对这个问题的一些见解将非常感谢。谢谢。

回答

7

可以移动统一到该条的头部和简单地写为:

second([_, Second| _], Second). 

为列表中的符号是写由逗号分隔的初始元素,然后竖线分开列表尾部,即包含其余元素的列表。一些例子,你可以尝试在序言顶级的解释应该更清楚:

?- [1, 2, 3] = [Head| Tail]. 
Head = 1, 
Tail = [2, 3]. 

?- [1, 2, 3] = [First, Second| Tail]. 
First = 1, 
Second = 2, 
Tail = [3]. 

?- [1, 2, 3] = [First, Second, Third| Tail]. 
First = 1, 
Second = 2, 
Third = 3, 
Tail = []. 
2

[详细模式ON]

一个列表在序言要么是空列表[]或一个头部和一个尾部,其在技术上由“点”函数表示,在Prolog中为'.'(H,T),但是Prolog提供语法上更友好的表示,[H|T],H是一个元素,并且尾部,T本身就是一个列表。如果你看看LISP,它们分别是列表的汽车cdr。在Prolog中,竖线|头部尾部分开。

在Prolog的提示,你可以输入X = '.'(H,T).,看看你会得到什么:

| ?- X ='.'(H,T). 

X = [H|T] 

yes 
| ?- 

如果你有一个元素的列表,这将是[X],但在技术上是[X|[]]'.'(X,[])。如果你有两个元素的列表,它可以写成:

[X,Y] 
[X|[Y]] 
'.'(X,[Y]) 
[X|'.'(Y,[])] 
'.'(X,'.'(Y,[])) 

这些形式的所有工作,但最常见的形式是[X,Y],或者根据上下文,[X|[Y]]如果你需要的头/尾表示。你很少会需要使用点符号。

在句法友好(非点)形式中,非空列表可以由一个或多个离散元素表示,然后可选地由尾部表示(尾部在垂直条之后指定, |),其本身可以是列表或空列表[]。许多元素的列表,E1E2,...,En可以写在许多方面,概括了上述想法:

[E1,E2,...,En] 
[E1|T]     % T = [E2,E3,...,En] 
[E1,E2|T]    % T = [E3,E4,...,En] 
[E1,...,Ek|T]   % T = [Ek+1,Ek+2,...,En] 
[E1|[E2|T]]    % T = [E3,E4,...,En] 
[E1|[E2|...[Ek|T]]...]] % T = [Ek+1,Ek+2,...,En] 

所以两个竖线(|)没有意义的形式[X|Y|T]但他们的表单,[X|[Y|T]]。由于尾部T本身是一个列表(或[]),它遵循与原始列表相同的表示规则。因此,该列表本质上是一种适用于递归的结构。 Prolog中的许多操作列表的操作都是递归的,通过操作头部,然后调用自己的尾部,并在看到空列表[]时结束。

如果我统一两个清单,L1 = L2,我希望它成功,那么(1)名单将需要相同的长度,和(2)L1每个元素都必须unifiable与它在L2相应元素。因此,如果我在Prolog提示符下执行此操作:

| ?- [X,2,Z] = [1,Y,3]. 

X = 1 
Y = 2 
Z = 3 

yes 
| ?- 

我已成功统一显示变量的值。我也可以这样做:

| ?- [X|T] = [1,2,3,4]. 

T = [2,3,4] 
X = 1 

yes 
| ?- 

的Prolog能够统一,如果X进行实例化1和尾部的两个列表,T进行实例化[2,3]。我也可以这样做:

| ?- [X,Y|T] = [1,2,3,4]. 

T = [3,4] 
X = 1 
Y = 2 

yes 
| ?- 

正如Paolo指出的那样,这显示了如何获得第二个元素。你也可以这样来做:

| ?- [X|[Y|T]] = [1,2,3,4]. 

T = [3,4] 
X = 1 
Y = 2 

yes 
| ?- 

这真的意味着同样的事情,只是看着有不同的语法:第二个元素是列表的尾部或头部(在LISP“的汽车cdr“)。

相关问题