Предположим, у меня есть список Xs = [a,b,c].
Теперь я хочу выполнить итерацию по всем элементам и вызвать другую функцию для этих элементов. Мой вопрос: как это сделать, используя голову и хвост? Я был бы благодарен за помощь.Пролог-итерация по списку
ответ
Как правило, вы не выполняете итерацию в 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
будет объединяться с более коротким списком для продолжения обработки. Когда список хвостов пуст, первое предложение будет унифицировано, тем самым завершив обработку.
Хотя этот ответ правильный, это очень 1970-е годы. В то же время существует ['maplist (process, [a, b, c])'] (http://stackoverflow.com/a/30759136/772868) и ['maplist/3',' maplist/4 '...] (http://stackoverflow.com/a/6683502/772868) – false
@false Вы абсолютно правы. Тем не менее, OP хотел знать «как это сделать, используя голову и хвост», поэтому я объяснил, как это делается в 1970-х годах. Я думаю, что глубокое понимание этого простого фрагмента кода очень важно для понимания того, как Prolog делает что-то. Конечно, практики Prolog быстро обнаруживают «maplist/2», и они никогда не возвращаются. – dasblinkenlight
Хотя мы должны здесь ответить на поставленные вопросы, эти вопросы часто содержат части, которые лучше игнорировать. – false
С одной стороны, карта - ваш друг – therealprashant