我目前正在编写一个谓词,该谓词将贯穿列表列表并将我计算出的值插入列表的开头
第一步很简单,只需对每个列表执行计算,并用它统一变量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个内部变量]'不是一个功能。
有人有任何提示吗?
答案 0 :(得分:4)
使用meta-predicate maplist/3
和Prolog lambda只需写下:
?- use_module(library(lambda)). ?- maplist(\Es^[N|Es]^count_validentries(Es,N), Ess, Xss).
此外,我猜你是否真正寻找(-)/2
对,这是键值对通常由库谓词和内置表示的方式-in谓词keysort/2
。考虑:
?- Ess = [[a,b,c],[d,e],[],[f]], maplist(\Es^(N-Es)^length(Es,N), Ess, Xss), keysort(Xss, Yss). Ess = [ [a,b,c], [d,e], [], [f]], Xss = [3-[a,b,c], 2-[d,e], 0-[], 1-[f]], Yss = [0-[], 1-[f], 2-[d,e], 3-[a,b,c]].
答案 1 :(得分:2)
也许
checkthrough([],Sofar,Sofar).
checkthrough([H|T],Sofar,Lastone):-
count_validentries(H,N),
checkthrough(T,[[N|H]|Sofar],Lastone).
但你最终会得到 reverse 这个列表。保持简单将有助于
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).