以下元谓词通常很有用。请注意,它无法调用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).
答案 0 :(得分:2)
{call(P_2,A,B)}, [B]
优于[B], {call(P_2,A,B)}
吗?
(如果是这样的话,不应该maplist/3
得到类似的东西吗?)
dcg [B],{call(P_2,A,B)}
和非 - dcg 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).
dcg {call(P_2,A,B)},[B]
和非 - dcg 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).
上面,我们强调了现在使用的目标排序:
maplist/3
,定义为in this answer on SO和in the Prolog prologue maplistDCG//2
,由OP 如果我们考虑......
...我们发现变量应该不与连接目标明确断开连接。 maplist/3
的自然 DCG模拟maplistDCG//2
定义如下:
maplistDCG(_,[]) -->
[].
maplistDCG(P_2,[A|As]) -->
[B],
{call(P_2,A,B)},
maplistDCG(P_2,As).
脚注1:为了强调共性,我们调整了变量名称,代码布局,并明确了一些统一。 脚注2: ......除非我们确实有良好原因导致他们的分歧......