3

以下元谓词通常很有用。请注意,它不能被调用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).
4

1 回答 1

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(_,[]) --> []。% 地图列表(_,[],[])。          
    maplistDCG(P_2,[A|As]) --> % maplist(P_2,[A|As],Bs0) :-
       [B], %         Bs0 = [B|Bs] ,    
       {呼叫(P_2,A,B)},%        呼叫(P_2,A,B),
       地图列表DCG(P_2,As)。% 地图列表(P_2,As,Bs)。     
    
  2. {call(P_2,A,B)},[B]和非 call(P_2,A,B), Bs0 = [B|Bs]

    maplistDCG(_,[]) --> []。% 地图列表(_,[],[])。
    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],
       地图列表DCG(P_2,As)。% 地图列表(P_2,As,Bs)。
    

上面,我们强调了现在使用的目标排序:

如果我们认为...

  • ... 需要考虑终端属性和 ...

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

...我们发现变量不应连接目标显式断开连接。的天然DCG 类似物maplist/3定义maplistDCG//2如下:

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

脚注 1:为了强调共性,我们调整了变量名称、代码布局,并明确了一些统一。 脚注 2: ……除非我们对他们的不同行为有充分的理由……

于 2015-11-02T14:20:42.367 回答