在此任务中遇到一些问题。获取Prolog中列表的第二个元素
目前我已经试过这个,我知道这是错误的,因为我不知道如何将L分成它的头部和尾部,但是这是我要去做的想法。
second(L,E) :- [H | E | T]
我认为,E必须在头后面,使它成为第二个元素。不过,我对这种语言很陌生,并希望得到一些见解。我如何从写出谓词的方式得到这个头和尾。对这个问题的一些见解将非常感谢。谢谢。
在此任务中遇到一些问题。获取Prolog中列表的第二个元素
目前我已经试过这个,我知道这是错误的,因为我不知道如何将L分成它的头部和尾部,但是这是我要去做的想法。
second(L,E) :- [H | E | T]
我认为,E必须在头后面,使它成为第二个元素。不过,我对这种语言很陌生,并希望得到一些见解。我如何从写出谓词的方式得到这个头和尾。对这个问题的一些见解将非常感谢。谢谢。
可以移动统一到该条的头部和简单地写为:
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 = [].
[详细模式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]]
如果你需要的头/尾表示。你很少会需要使用点符号。
在句法友好(非点)形式中,非空列表可以由一个或多个离散元素表示,然后可选地由尾部表示(尾部在垂直条之后指定, |
),其本身可以是列表或空列表[]
。许多元素的列表,E1
,E2
,...,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“)。