Prolog - 如何在prolog中实现嵌套函数?

时间:2012-12-03 07:58:08

标签: prolog

我需要在下面写下规则:

编写谓词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:参数没有充分实例化”。

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).