2015-10-31 16 views
3

Часто используется мета-предикат. Обратите внимание, что его нельзя назвать 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). 
+0

Я не получаю полностью ваш вопрос: я могу видеть, что [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

ответ

2

ли {call(P_2,A,B)}, [B] преимущества перед [B], {call(P_2,A,B)}?
(? И, если да, то не maplist/3 должны получить что-то подобное, тоже)

Давайте поставим соответствующие и не- варианты бок о бок :

  1. [B],{call(P_2,A,B)} и не- Bs0 = [B|Bs], call(P_2,A,B)

     
    maplistDCG(_,[]) --> [].  %  maplist(_,[],[]).   
    maplistDCG(P_2,[A|As]) -->  %  maplist(P_2,[A|As],Bs0) :- 
        [B],       %  Bs0 = [B|Bs],  
        {call(P_2,A,B)},    %  call(P_2,A,B), 
        maplistDCG(P_2,As).   %  maplist(P_2,As,Bs).  
    
  2. {call(P_2,A,B)},[B] и не- call(P_2,A,B), Bs0 = [B|Bs]

     
    maplistDCG(_,[]) --> [].  %  maplist(_,[],[]). 
    maplistDCG(P_2,[A|As]) -->  %  maplist(P_2,[A|As],Bs0) :- 
        {call(P_2,A,B)},    %  call(P_2,A,B), 
        [B],       %  Bs0 = [B|Bs], 
        maplistDCG(P_2,As).   %  maplist(P_2,As,Bs). 
    

Выше мы отмечали, упорядоченность цель в использовании в настоящее время:

Если мы считаем, что ...

  • ... свойства терминации необходимо принимать во внимание и ...

  • ... и не- варианты должны лучше вести себя так же ...

... мы находим й при переменной должен не быть явно отключен от соединительной цели.естественного DCG аналог maplist/3 является maplistDCG//2 определяется следующим образом:

maplistDCG(_,[]) --> 
    []. 
maplistDCG(P_2,[A|As]) --> 
    [B], 
    {call(P_2,A,B)}, 
    maplistDCG(P_2,As). 

Сноска 1: Чтобы подчеркнуть общности, мы адаптировали имена переменных, структуру коды, и сделали некоторые явные унификации. Сноска 2: ... если у нас нет действительно хороших причин их расходящегося поведения ...

+1

И тогда есть * стойкость *. – false

+0

@false. С переупорядочением 'maplist/3' в порядке w.r.t. стойкость, но с 'maplistDCG // 2' это проблема? – repeat

 Смежные вопросы

  • Нет связанных вопросов^_^