我在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调试器,它到达了正确的结果,但随后它不断检查东西。我知道它与统一有关,但我不知道如何应用它。
答案 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个参数中返回的列表中添加项。