转载自:https://mp.weixin.qq.com/s/tkoV2byIhCCP1b-kOMmkeg
1、获取列表中的最后一个元素
my_last(X,[X]). %是最后一个元素则合一
my_last(X,[_|L]) :- %X是列表L的最后一个元素
my_last(X,L). %如果不是最后一个元素继续递归
运行效果如下:
?- my_last(A, [a,b,c,d,e,f,g]).
A = g ;
;
false.
2、获取列表的倒数第二个元素
last_but_one(X,[X,_]). %列表中有2个元素取第一个,完成合一
last_but_one(X,[_,Y|Ys]) :- %如果列表的元素个数比2个多,则继续递归
last_but_one(X,[Y|Ys]).
运行效果如下:
?- last_but_one(A, [1,2,3,4,5,6,7]).
A = 6 .
true.
3、获取指定位置的元素,获取指定元素的位置
%注意有个内置谓词:nth1(?Index, ?List, ?Elem)
element_at(X,[X|_],1). %列表中的第一个元素是数字1。
element_at(X,[_|L],K) :- %X是列表L中的第K个元素
K > 1,
K1 is K - 1,
element_at(X,L,K1).
?- element_at(X,[a,b,c,d,e,f,g],4).
X = d ;
;
false.
运行效果如下:
?- element_at(c,[a,b,c,d,e,f,g],X).
ERROR: [Thread pdt_console_client_0_Default Process] Arguments are not sufficiently instantiated
ERROR: [Thread pdt_console_client_0_Default Process] In:
ERROR: [Thread pdt_console_client_0_Default Process] [15] _318456>1
ERROR: [Thread pdt_console_client_0_Default Process] [14] element_at(c,[a,b|...],_318486) at /Users/limanxi/Documents/prolog_99problem/99Prolog-Examples/Prolog Lists/src/p1_03.pl:15
ERROR: [Thread pdt_console_client_0_Default Process] [13] <user>
修改后的
: