2015-06-12 4 views
2

Предположим, у меня есть список Xs = [a,b,c]. Теперь я хочу выполнить итерацию по всем элементам и вызвать другую функцию для этих элементов. Мой вопрос: как это сделать, используя голову и хвост? Я был бы благодарен за помощь.Пролог-итерация по списку

+0

С одной стороны, карта - ваш друг – therealprashant

ответ

6

Как правило, вы не выполняете итерацию в Prolog. Вместо этого, вы пишете правило с парой рекурсивных статей, например:

dosomething([]). 
dosomething([H|T]) :- process(H), dosomething(T). 

Первый пункт обрабатывает базовый случай, когда список [] пуст. В этом случае нечего делать, поэтому тело правила также пусто.

Второе предложение обрабатывает случай, когда ваш список имеет хотя бы один элемент. Синтаксис [H|T] объединяет ваш список таким образом, что H становится главой списка, а T становится его хвостом. Например, если вы обрабатываете dosomething([a,b,c]), H становится a, а T становится [b,c].

Тело этого правила состоит из двух частей. Первая часть работает на голове, называя process. Это правило, которое вы хотите выполнить для каждого элемента списка. Вторая часть вызывает dosomething правило рекурсивно в хвосте списка. Когда список хвостов не пуст, второе предложение dosomething будет объединяться с более коротким списком для продолжения обработки. Когда список хвостов пуст, первое предложение будет унифицировано, тем самым завершив обработку.

+5

Хотя этот ответ правильный, это очень 1970-е годы. В то же время существует ['maplist (process, [a, b, c])'] (http://stackoverflow.com/a/30759136/772868) и ['maplist/3',' maplist/4 '...] (http://stackoverflow.com/a/6683502/772868) – false

+2

@false Вы абсолютно правы. Тем не менее, OP хотел знать «как это сделать, используя голову и хвост», поэтому я объяснил, как это делается в 1970-х годах. Я думаю, что глубокое понимание этого простого фрагмента кода очень важно для понимания того, как Prolog делает что-то. Конечно, практики Prolog быстро обнаруживают «maplist/2», и они никогда не возвращаются. – dasblinkenlight

+2

Хотя мы должны здесь ответить на поставленные вопросы, эти вопросы часто содержат части, которые лучше игнорировать. – false