Prolog谓词无法识别递归中传递的参数

Prolog谓词无法识别递归中传递的参数,prolog,Prolog,我试图编写一个prolog语法来删除列表中的每个第n个元素。我的代码如下: deletenth([], _, _, []). deletenth([_H | T], N, 1, T) :- deletenth(T, N, N, T). deletenth([H | T], GlobalN, LocalN, [H | T]) :- LocalN \= 0, TMP is LocalN - 1, deletenth(T, GlobalN, TMP, T). 我的问题

我试图编写一个prolog语法来删除列表中的每个第n个元素。我的代码如下:

deletenth([], _, _, []).
deletenth([_H | T], N, 1, T) :-
    deletenth(T, N, N, T).
deletenth([H | T], GlobalN, LocalN, [H | T]) :-
    LocalN \= 0,
    TMP is LocalN - 1,
    deletenth(T, GlobalN, TMP, T).

我的问题是,如果在递归过程中得到<代码> Loaln=1</Case>参数,它将无法识别中间的谓词。只有从终端手动调用它。也许我的代码根本不适合这个任务,但这件事一直困扰着我。我希望有人能帮助我。

您的问题是,在第三个子句中,您在head和deletenth/4的递归调用中都使用了T作为输入和输出。您可能希望
deleteneth(T,GlobalN,TMP,NewT)
并在头部将第四个参数替换为
[H|NewT]
。哦,我明白了。。。现在我已经更改了它,它可以正常工作,但是除了正确的结果之外,它还提供了其他结果:))thx要获得帮助,我可能需要查看
torolk/4
的代码才能获得更多帮助。我鼓励您使用
succ(TMP,LocalN)
而不是
TMP是LocalN-1
,虽然这可能不是问题。哎呀,我忘了翻译那段代码,它与deletenth相同,只是匈牙利语:))啊,所以您的条件是LocalN\=0,但基本情况是LocalN=1,所以您永远无法达到它。将您的条件更改为
LocalN\=1