将值插入每个子列表的开头

时间:2016-05-09 16:19:47

标签: list prolog

我目前正在编写一个谓词,该谓词将贯穿列表列表并将我计算出的值插入列表的开头

第一步很简单,只需对每个列表执行计算,并用它统一变量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个内部变量]'不是一个功能。

有人有任何提示吗?

2 个答案:

答案 0 :(得分:4)

使用 maplist/3和Prolog 只需写下:

?- 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).