prolog每2个元素发布一次输出

prolog每2个元素发布一次输出,prolog,Prolog,编写一个Prolog谓词everynth(N,X),它输出列表X的每个Nth元素 ?- everynth(1, [1, 2, 3, 4, 5, 6]). 1 2 3 4 5 6 true. ?- everynth(2, [1, 2, 3, 4, 5, 6]). 2 4 6 true. 以下是我尝试过的,尽管我不知道如何正确使用递归: everynth(1, [X|_]) :- write(X), write(' '). everynth(N, [_|H]) :- M i

编写一个Prolog谓词
everynth(N,X)
,它输出列表
X
的每个
N
th元素

?- everynth(1, [1, 2, 3, 4, 5, 6]).
1 2 3 4 5 6
true.
?- everynth(2, [1, 2, 3, 4, 5, 6]).
2 4 6
true.
以下是我尝试过的,尽管我不知道如何正确使用递归:

everynth(1, [X|_]) :-
    write(X),
    write(' ').
everynth(N, [_|H]) :-
    M is N - 1,
    everynth(M, H).

我实现了一个单独的帮助程序,因为第一次成功调用everynthHelper/2确保了我们将在最后输出
true

如果这是家庭作业,请将其标记为“家庭作业”,并告诉我们您迄今为止尝试了什么以及您目前的问题是什么。我们不会在这里给你一个解决方案。如果不是,请描述您实际想要实现的目标,我们可以找出最好的方法。@user1400451为什么要使用循环而不是递归?我想我每次都可以减少它,递归应该是另一种方法,但我不太了解递归,因为我刚刚开始研究它。我替换了一个
代码中有一个
,这不是正确的Prolog语法。谢谢大家,谢谢你们的帮助。非常感谢,请批准答案,以便以后任何人都可以使用。我试过了,但程序说未定义的过程在。split_的用途是什么?你能帮我修一下吗?今天我将提交这份家庭作业。程序说未定义的程序在。那是什么?我跑不动它对我来说运行得很好,我会在一分钟内尝试并在这里给出反馈。
:- use_module(library(dialect/hprolog)).


everynth(N,X) :- nth1(N,X,Elem),
                 write(Elem),
                 write(' '),
                 split_at(N,X,_,NewX),
                 everynthHelper(N,NewX).

everynthHelper(N,X) :- length(X,LengthX),
                       N > LengthX, !. 
everynthHelper(N,X) :- nth1(N,X,Elem),
                       write(Elem),
                       write(' '),
                       split_at(N,X,_,NewX),
                       everynthHelper(N,NewX).