List 将值插入每个子列表的开始

List 将值插入每个子列表的开始,list,prolog,meta-predicate,lambda,List,Prolog,Meta Predicate,Lambda,我目前正在编写一个谓词,它将遍历一个列表,并在列表的开头插入一个我计算过的值 第一步很简单,只需对每个列表执行计算,并用它统一变量N checkthrough([]). checkthrough([H|T]):- count_validentries(H,N), checkthrough(T). 我现在试图实现的是将变量N放在每个子列表的开头,因此每个列表都以有效条目的计数开始 我尝试使用累加器来完成此操作。尝试从空列表开始,并在每次添加新值N和列表头时: checkthro

我目前正在编写一个谓词,它将遍历一个列表,并在列表的开头插入一个我计算过的值

第一步很简单,只需对每个列表执行计算,并用它统一变量N

checkthrough([]).

checkthrough([H|T]):-
    count_validentries(H,N),
    checkthrough(T).
我现在试图实现的是将变量N放在每个子列表的开头,因此每个列表都以有效条目的计数开始

我尝试使用累加器来完成此操作。尝试从空列表开始,并在每次添加新值N和列表头时:

checkthrough([],Sofar,Lastone).

checkthrough([H|T],Sofar,Lastone):-
    count_validentries(H,N),
    Newsofar is [N,H|Sofar],
    checkthrough(T,Newsofar,Lastone).
我很确定我在这条路上的某个地方犯了一个非常愚蠢的错误。这是无效的Prolog语法,算术失败:“[2个内部变量]”不是函数

有人有什么建议吗?

也许吧

checkthrough([],Sofar,Sofar).
checkthrough([H|T],Sofar,Lastone):-
  count_validentries(H,N),
  checkthrough(T,[[N|H]|Sofar],Lastone).
但你最终会把清单颠倒过来。保持简单会有帮助

checkthrough([],[]).
checkthrough([H|T],[[N|H]|Rest]):-
  count_validentries(H,N),
  checkthrough(T,Rest).
或者更好,如果您正在运行最新版本的SWI Prolog:

checkthrough(L,L1) :-
   maplist([E,E1]>>(count_validentries(E,N),E1=[N|E]), L,L1).
也许吧

但你最终会把清单颠倒过来。保持简单会有帮助

checkthrough([],[]).
checkthrough([H|T],[[N|H]|Rest]):-
  count_validentries(H,N),
  checkthrough(T,Rest).
或者更好,如果您正在运行最新版本的SWI Prolog:

checkthrough(L,L1) :-
   maplist([E,E1]>>(count_validentries(E,N),E1=[N|E]), L,L1).
使用和Prolog只需编写:

?- use_module(library(lambda)). ?- maplist(\Es^[N|Es]^count_validentries(Es,N), Ess, Xss). 使用和Prolog只需编写:

?- use_module(library(lambda)). ?- maplist(\Es^[N|Es]^count_validentries(Es,N), Ess, Xss).