Я пытаюсь разделить список в Прологе на 3 равные части (... ну, как можно равнее).Мой алгоритм следующий:
- Узнать размер начального списка.
- Вызвать процедуру с двумя дополнительными параметрами (размер списка и счетчик, который сообщит мнекогда я должен прекратить добавлять элементы в один список и начать добавлять в другой)
Процедура выглядит следующим образом:
С 4 параметрами:
div3(InitialList,FirstNewList,SecondNewList,ThirdNewList).
С2 дополнительных параметра:
div3(InitialList,FirstList,SecondList,ThirdList,InitialListSize,Counter).
Вот мой код:
div3([],[],[],[]).
div3([X],[X],[],[]).
div3([X,Y],[X],[Y],[]).
div3([X,Y,Z],[X],[Y],[Z]).
div3([X | Y],A,B,C) :- length([X | Y],Sz),
Sz1 is 0,
div3([X | Y],A,B,C,Sz,Sz1).
div3([X | Y],A,B,C,Sz,Sz1) :- Sz1 < Sz//3, % am I done adding to the 1st list?
append(X,L,A), % add to the 1st list
Sz2 is Sz1+1, % increment the counter
div3(Y,L,B,C,Sz,Sz2),!.
div3([X | Y],A,B,C,Sz,Sz1) :- Sz1 < 2*Sz//3, % am I done adding to the 2nd list?
append(X,L,B), % add to the 2nd list
Sz2 is Sz1+1, % increment the counter
div3(Y,A,L,C,Sz,Sz2),!.
div3([X | Y],A,B,C,Sz,Sz1) :- Sz1 < Sz, % am I done adding to the 3rd list?
append(X,L,C),% add to the 3rd list
Sz2 is Sz1+1, % increment the counter
div3(Y,A,B,L,Sz,Sz2),!.