Часто используется мета-предикат. Обратите внимание, что его нельзя назвать maplist//2
, потому что его расширение столкнется с maplist/4
.Версия DCG для maplist/3
maplistDCG(_P_2, []) -->
[].
maplistDCG(P_2, [A|As]) -->
{call(P_2, A, B)},
[B],
maplistDCG(P_2, As).
Здесь есть несколько вопросов. Конечно, имя. Но также терминал [B]
: должен ли он быть явно отключен от соединительной цели?
Без определения, нужно написать либо одно из следующего - оба имеют серьезные проблемы с терминацией.
maplistDCG1(P_2, As) -->
{maplist(P_2, As, Bs)},
seq(Bs).
maplistDCG2(P_2, As) -->
seq(Bs),
{maplist(P_2, As, Bs)}.
seq([]) -->
[].
seq([E|Es]) -->
[E],
seq(Es).
Я не получаю полностью ваш вопрос: я могу видеть, что [dcgutils] (HTTP://www.swi-prolog.org/pack/list?p=dcgutils):[seqmap](http://www.swi-prolog.org/pack/file_details/dcgutils/prolog/dcg_core.pl?show=src) семья принимает другой подход, чем ваш ... – CapelliC