2012-05-17 1 views
2

Написать Пролог предикат everynth(N, X), который выводит каждый Nth элемент списка X.proog issue output каждые 2 элемента

?- 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). 
+0

Может кто-нибудь мне помочь? – user1400451

+1

Если это домашнее задание, отметьте его как «домашнее задание» и сообщите нам, что вы пробовали до сих пор, и какова ваша проблема на данный момент. Мы не просто дадим вам решение здесь. Если это не так, пожалуйста, опишите, что вы на самом деле пытаетесь достичь, и мы можем найти лучший способ. –

+0

@ user1400451 зачем это делать с помощью цикла, а не с рекурсией? –

ответ

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 в конце.

+0

спасибо, ребята, спасибо за вашу помощь. действительно оцените за это – user1400451

+1

, пожалуйста, подтвердите ответ, чтобы каждый мог использовать его позже. –

+0

Я попробовал, но программа говорит о неопределенной процедуре split_at. для чего используется split_at? – user1400451