Prolog没有回复问价值

时间:2011-11-16 14:08:25

标签: prolog

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

我有这个:

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

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

1 个答案:

答案 0 :(得分: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个参数中返回的列表中添加项。