列出未终止的搜索

时间:2012-08-29 19:23:48

标签: prolog

这次我真的无法理解错误:我编写了这段代码来将list元素放在某个位置:

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).它与最后一个匹配。

我错过了什么?

2 个答案:

答案 0 :(得分: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).

答案 1 :(得分:1)

你的问题是第一个子句有;,我认为你的意思是.。 无论如何,如果纠正的第一个条款什么都不做,那么它应该完全删除:

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