如何找到列表的第N个元素,并打印出所述元素?

时间:2011-12-06 00:33:33

标签: list prolog

所以我有一个家庭作业问题,要求我找到列表的第三个元素,以及列表的最后一个元素并打印出来(2个单独的程序)。

我认为我的代码可以通过跟踪索引找到第三个元素,但是当我尝试运行代码时收到错误:

findthird([], Result).

findthird(List, Result) :- secondFunc(List, 0, Result).

secondFunc([Head|Tail], Count, Result) :- 
    Count < 3, Count is Count+1, secondFunc(Tail, Count, Result).

secondFunc([Head|Tail], Count, [Head|Result]).

有什么想法吗?

我现在收到的输出是:

| ?- findthird([2,3,4], Result).

Result = [2|_]

yes

我仍然很难在Prolog周围徘徊,我似乎无法理解它。

任何帮助都会一如既往地受到赞赏,

感谢。

更新了新的尝试代码***

更新**这是解决我问题的代码:

findthird([], Result).
findthird(List, Result) :- secondFunc(List, 0, Result).

secondFunc([], Count, []).
secondFunc([Head|Tail], Count, Result) :- 
     Count1 is Count+1, Count1 < 3, secondFunc(Tail, Count1, Result).
secondFunc([Head|Tail], Count, Head).

输入:

| ?- findthird([3,4,5], Result).

输出:

Result = 5 ? 

yes

输入:

| ?- findthird([3,4,5,6,7], Result).

输出:

Result = 5 ? 

yes

1 个答案:

答案 0 :(得分:4)

首先,您必须了解在Prolog中,您不会操纵函数的返回值。这背后的原因是你不操纵函数,而是谓词。因此,length(List)永远不会像任何其他谓词一样评估数字,而是评估为true或false。当您编写findelement(List, length(List), len...时,不会使用[a, b, c]3之类的内容调用findelement谓词,将使用[a, b, c]length([a, b, c])之类的方式调用它。所以你的程序已经无法正常工作了。

抛开这个,你的程序仍然是非常错误的。递归在prolog或函数式语言中工作的基本方式(以及在数学中使用结构归纳法时)如下:

  • 初始化条款

  • 遗传条款

在您的程序中,您没有初始化子句。这意味着当递归命中[]时,没有子句可以处理它,并且事情失败了。其余的也是假的,但我认为首先让递归原则正确是特别重要的。

为了说明这一点而不是为你破坏问题(毕竟这是家庭作业),我会举一个例子:说你想测试羊圈是否安全。如果里面没有狼,羊圈是安全的。如果我们用列表代表羊圈,用原子wolf代表狼,我们可以像这样编写谓词:

初始化:如果羊圈是空的,那是安全的,里面没有狼。

safe_sheepfold([]).

遗传:如果羊圈对n-1成员是安全的,如果添加的成员不是狼,那么n个成员是安全的:

safe_sheepfold([Animal|Sheepfold]) :-
    Animal =\= wolf,
    safe_sheepfold(Sheepfold).

就是这样。要查看prolog如何处理请求,请编译它并发出跟踪。运行谓词之前的命令,正如你在上一个问题中指出的那样,它将帮助你理解事情的运作方式。

让你通过一个更具体的例子考虑这个问题,这里有一个经典的谓词,因子(它也使用算术):

这是我们的初始化条款:

factorial(0, 1).

这是我们的遗传条款:

factorial(N, F) :-
    N > 0,
    NextN is N - 1,
    factorial(NextN, NextF),
    F is NextF * N.

为了保持这个简单,我没有使这个谓词尾部递归也没有使用剪切,你以后会学到这些东西!

我希望我的漫无边际会有所帮助。

编辑帖子更新:

几乎就是这样!现在只需要几个提示:你想要的结果不是列表,它只是一个元素,所以尝试修改最后一个子句只返回元素,而不是带有元素的列表。初始化子句实际上是你的最后一个子句(检查你是否超过3),所以你不需要[]的那个!你快到了:)