如何避免辅助谓词?
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).
它有效,但在我看来那些辅助谓词 go
和 step
可以内联。有什么建议吗?
我尝试了以下 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], !.
(出于某种原因,我不理解 forall
和 member
的检查在这种情况下有效,但更简单的 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]
),
!.
我编写了以下代码来转置(有限)列表的(有限)列表(到目前为止,我无法利用 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).
它有效,但在我看来那些辅助谓词 go
和 step
可以内联。有什么建议吗?
我尝试了以下 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], !.
(出于某种原因,我不理解 forall
和 member
的检查在这种情况下有效,但更简单的 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]
),
!.