2

这次我真的无法理解错误:我编写了这段代码来获取某个位置的列表元素:

take_pos([], _, _) :- fail;
take_pos([H|T], 1, H).
take_pos([H|T], Pos, X) :- Pos2 is Pos - 1, take_pos(T, Pos2, X).

它永远不会终止;跟踪它我可以看到它永远不会匹配第二个语句。另外,如果我查询take_pos([1,2,3], 1, 1).它与最后一个匹配。

我错过了什么?

4

2 回答 2

1

我认为问题在于您在 . 之后放置了分号而不是点fail

还要考虑重写第二条规则以避免引入单例:

take_pos([], _, _) :- fail.
take_pos([H|_], 1, H).
take_pos([H|T], Pos, X) :- Pos2 is Pos - 1, take_pos(T, Pos2, X).
于 2012-08-29T19:27:39.247 回答
1

你的问题是第一个子句有一个;where 我认为你的意思.。无论如何,如果更正了第一个子句,则它什么也不做,因此应该完全删除它:

take_pos([H|T], 1, H).
take_pos([H|T], Pos, X) :- Pos2 is Pos - 1, take_pos(T, Pos2, X).
于 2012-08-29T19:32:23.000 回答