2011-11-16 67 views
2

我在Prolog中有此程序,它从列表中删除每个第n个元素的元素,如: removenth([1,2,3,4,5,6],2,R)。 它应该返回:R = [1,3,5]。Prolog不返回问值

我有这样的:

removeallNth(F, N, R):- removeallNth(F, N, 1, R). 
removeallNth([], _, _, R). 
removeallNth([H|T], N, C, R):- N \== C, Nc is C + 1, concat(R,H,S), 
removeallNth(T, N, Nc, S). 
removeallNth([_|T], N, C, R):- N == C, removeallNth(T, N, 1, R). 

的问题是,它返回真代替 R = [1,3,5]。我检查了SWI-Prolog调试器,它到达了正确的结果,但它保持检查的东西。我知道这与统一有关,但我不知道如何应用它。

回答

4

考虑这个修改程序:

removeallNth(F, N, R):- removeallNth(F, N, 1, R). 

removeallNth([], _, _, []). 
removeallNth([H|T], N, C, [H|R]):- 
    N \== C, Nc is C + 1, 
    removeallNth(T, N, Nc, R). 
removeallNth([_|T], N, C, R):- 
    N == C, 
    removeallNth(T, N, 1, R). 

在removeallNth/4的第一句话,你必须返回一个空列表。

在removeallNth/4的第二个子句中,您不需要执行concat,只需要返回在该子句头部的第4个参数中返回的列表中添加该项目。

+0

这是工作,谢谢!我需要充分理解Prolog中的递归。它如何从调用堆栈的结尾到开始构造所需的结果。我试图通过concat在每次迭代中创建结果列表。 – Pravel