2016-05-09 7 views
1

В настоящее время я пишу предикат, который будет работать по списку списков и вставить значение я рассчитал на начало списказначения вставляя в начало каждого подсписка

Шаг один легко, просто выполнять вычисление для каждого списка и объединение переменной 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

Может

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-Пролог:

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

Использование maplist/3 и Пролог просто написать:

 
?- use_module(library(lambda)). 

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

Кроме того, я бы предположил, что вы действительно ищет (-)/2 пары, пары значений обычно представлены — предикатами библиотеки и встроенным предикатом 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]]. 
Смежные вопросы