如何避免辅助谓词?

How to avoid auxiliary predicates?

我编写了以下代码来转置(有限)列表的(有限)列表(到目前为止,我无法利用 Prolog 中的足够惰性来处理无限情况):

transpose_opt([],[]) :- !.
transpose_opt(L,M) :-
  maplist(go,L,C,R),
  step(C,R,M).
go([],none,[]).
go([H|T],some(H),T).
step(C,_,[]) :- list_to_set(C,[none]), !.
step(C,R,[C|S]) :- transpose_opt(R,S).

transpose(L,M) :-
  transpose_opt(L,O),
  maplist(
    [X,Y]>>(
      maplist([X,Y]>>(X=..[_|Y]),X,V),
      append(V,Y)
    ),O,M).

它有效,但在我看来那些辅助谓词 gostep 可以内联。有什么建议吗?

我尝试了以下 with step 失败(导致将 M 与 unboud 变量的单例统一):

transpose_opt([],[]) :- !.
transpose_opt(L,M) :-
  maplist(go,L,C,R),
  forall(member(X,C),X=none) ->
    M=[], !;
    transpose(R,S), M=[C|S], !.

(出于某种原因,我不理解 forallmember 的检查在这种情况下有效,但更简单的 list_to_set 不适用。)

您写道:

results in unifying M with a singleton of an unboud variable

试试看:

transpose_opt(L,M) :-
  maplist(go,L,C,R),
  (   forall(member(X,C),X=none) ->
      M=[]
  ;   transpose(R,S), M=[C|S]
  ),
  !.