2

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

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

1 回答 1

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

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

于 2012-05-17T12:32:21.117 回答