lisp procedure mkpartitions(m,q,min,max,partitie,partitielist);
if q=1 then
  if m>=min then reverse(m . partitie) . partitielist
  else partitielist
else
  if min>max then partitielist
  else mkpartitions(m-min,q-1,min,(m-min)/(q-1),min . partitie,
                    mkpartitions(m,q,min+1,max,partitie,partitielist))$

lisp procedure partities(m,q,min);
mkpartitions(m,q,min,m/q,nil,nil)$

lisp procedure mkallpartitions m;
for i:=m step -1 until 1 conc partities(m,i,1)$

lisp operator mkvarlist;
lisp procedure mkvarlist(m,q);
'list . processpartitielist(partities(m,q,0),nil)$

lisp procedure processpartitielist(partitielist,varlist);
if null partitielist then varlist
else processpartitielist(cdr partitielist,
            processpartitie(car partitielist,0,nil,nil . nil,varlist))$

lisp procedure processpartitie(partitie,oldi,oldilist,var,varlist);
if null partitie then if null car var then ('times . cdr var) . varlist else
  ('times . ('ext . reverse ordn car var) . cdr var) . varlist
else if car partitie=0 then processpartitie(cdr partitie,oldi,oldilist,var,varlist)
else if car partitie=oldi then
  processcarpartitie(oldi,oldilist,cdr partitie,var,varlist)
else processcarpartitie(car partitie,
                        cdr nth(cdadr get('graadlijst,'avalue),car partitie),
                        cdr partitie,var,varlist)$

lisp procedure processcarpartitie(i,ilist,restpartitie,var,varlist);
if null ilist then varlist
else if evenp i then
  processcarpartitie(i,cdr ilist,restpartitie,var,
   processpartitie(restpartitie,i,ilist,car var . car ilist . cdr var,varlist))
else 
  processcarpartitie(i,cdr ilist,restpartitie,var,
   processpartitie(restpartitie,i,cdr ilist,(car ilist . car var) . cdr var,varlist))$

end;