我需要在下面写下规则:
编写谓词take(L,N,L1)的规则,如果列表L1包含,则成功 列表L的前N个元素,顺序相同。以下查询显示了使用此谓词的示例:
?- take([5,1,2,7], 3, L1).
L1 = [5,1,2]
?- take([5,1,2,7], 10, L1).
L1 = [5,1,2,7]
我的想法是随时删除第一个两个列表,直到L1为空。 我也在想我可以使用car([X | _],X)每次删除最后一个数字,直到第一个列表==第二个列表。我已经写了长度(L,Len),但我不知道接下来怎么做......
我的代码是:
take(L,X,[]).(I know it miss something, but I don't know how to do...)
take(H|L,N,H|L1):- take(L,X,L1), N is X-1.
=========================更新===================== ============================ 谢谢你1638891! 现在,代码是
take(L,0,[]).
take([H|L],N,[H|L1]):- take(L,X,L1), N is X+1.
但它在第二种情况下不起作用,即
?- take([5,1,2,7], 10, L1).
L1 = [5,1,2,7]
我尝试添加
take([],X,[])->!.
但它弹出“错误:是/ 2:参数没有充分实例化”。
答案 0 :(得分:0)
你真的想写X是N - 1。
take(L,0,[]).
take([H|L],N,[H|L1]):- take(L,X,L1), X is N-1.
作为一般规则,请尝试大声朗读您的规则。您编写的第一条规则读作“空列表是L中包含前X个元素的列表”。但它应该是“空列表是L中前0个元素的列表”作为基本情况。
答案 1 :(得分:0)
@ user1638891忘了交换减法,并且当你被要求提供比可用元素更多的元素时覆盖这个案例:
take(_,0,[]).
take([],_,[]).
take([H|L],N,[H|L1]) :- N > 0, X is N-1, take(L,X,L1).