适用于maplist / 3的DCG版本

时间:2015-10-31 17:57:33

标签: prolog dcg meta-predicate

以下元谓词通常很有用。请注意,它无法调用maplist//2,因为它的扩展会与maplist/4发生冲突。

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).

1 个答案:

答案 0 :(得分:2)

{call(P_2,A,B)}, [B]优于[B], {call(P_2,A,B)}吗? (如果是这样的话,不应该maplist/3得到类似的东西吗?)

让我们并列相应的和非变体 1

  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).
    
  3. 上面,我们强调了现在使用的目标排序:

    如果我们考虑......

    • ...终止属性需要考虑在内......

    • ... 和非变种应该更好地表现相同 2 ......

    ...我们发现变量应该与连接目标明确断开连接。 maplist/3自然 DCG模拟maplistDCG//2定义如下:

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

    脚注1:为了强调共性,我们调整了变量名称,代码布局,并明确了一些统一。 脚注2: ......除非我们确实有良好原因导致他们的分歧......