SIMSET BEGIN LINK CLASS LOF_INT(N); INTEGER N;; LINK CLASS LOF_LOF_INT(H); REF(HEAD) H;; REF(HEAD) PROCEDURE MAP(P_LI, P_LLI); REF(HEAD) P_LI; REF(HEAD) P_LLI; BEGIN REF(HEAD) V_RESULT; V_RESULT :- NEW HEAD; IF NOT P_LLI.EMPTY THEN BEGIN REF(LOF_LOF_INT) V_LLI; V_LLI :- P_LLI.FIRST QUA LOF_LOF_INT; WHILE V_LLI =/= NONE DO BEGIN REF(HEAD) V_NEWLIST; V_NEWLIST :- NEW HEAD; ! ADD THE SAME 1ST ELEMENT TO EVERY NEWLIST ; NEW LOF_INT(P_LI.FIRST QUA LOF_INT.N).INTO(V_NEWLIST); IF NOT V_LLI.H.EMPTY THEN BEGIN REF(LOF_INT) V_LI; V_LI :- V_LLI.H.FIRST QUA LOF_INT; WHILE V_LI =/= NONE DO BEGIN NEW LOF_INT(V_LI.N).INTO(V_NEWLIST); V_LI :- V_LI.SUC; END; END; NEW LOF_LOF_INT(V_NEWLIST).INTO(V_RESULT); V_LLI :- V_LLI.SUC; END; END; MAP :- V_RESULT; END MAP; REF(HEAD) PROCEDURE SUBSETS(P_LI); REF(HEAD) P_LI; BEGIN REF(HEAD) V_RESULT; IF P_LI.EMPTY THEN BEGIN V_RESULT :- NEW HEAD; NEW LOF_LOF_INT(NEW HEAD).INTO(V_RESULT); END ELSE BEGIN REF(HEAD) V_SUBSET, V_MAP; REF(LOF_INT) V_LI; V_SUBSET :- NEW HEAD; V_LI :- P_LI.FIRST QUA LOF_INT; ! SKIP OVER 1ST ELEMENT ; IF V_LI =/= NONE THEN V_LI :- V_LI.SUC; WHILE V_LI =/= NONE DO BEGIN NEW LOF_INT(V_LI.N).INTO(V_SUBSET); V_LI :- V_LI.SUC; END; V_RESULT :- SUBSETS(V_SUBSET); V_MAP :- MAP(P_LI, V_RESULT); IF NOT V_MAP.EMPTY THEN BEGIN REF(LOF_LOF_INT) V_LLI; V_LLI :- V_MAP.FIRST QUA LOF_LOF_INT; WHILE V_LLI =/= NONE DO BEGIN NEW LOF_LOF_INT(V_LLI.H).INTO(V_RESULT); V_LLI :- V_LLI.SUC; END; END; END; SUBSETS :- V_RESULT; END SUBSETS; PROCEDURE PRINT_LIST(P_LI); REF(HEAD) P_LI; BEGIN OUTTEXT("["); IF NOT P_LI.EMPTY THEN BEGIN INTEGER I; REF(LOF_INT) V_LI; I := 0; V_LI :- P_LI.FIRST QUA LOF_INT; WHILE V_LI =/= NONE DO BEGIN IF I > 0 THEN OUTTEXT(","); OUTINT(V_LI.N, 0); V_LI :- V_LI.SUC; I := I+1; END; END; OUTTEXT("]"); END PRINT_LIST; PROCEDURE PRINT_LIST_LIST(P_LLI); REF(HEAD) P_LLI; BEGIN OUTTEXT("["); IF NOT P_LLI.EMPTY THEN BEGIN INTEGER I; REF(LOF_LOF_INT) V_LLI; I := 0; V_LLI :- P_LLI.FIRST QUA LOF_LOF_INT; WHILE V_LLI =/= NONE DO BEGIN IF I > 0 THEN BEGIN OUTTEXT(","); ! OUTIMAGE; END; PRINT_LIST(V_LLI.H); V_LLI :- V_LLI.SUC; I := I+1; END; END; OUTTEXT("]"); OUTIMAGE; END PRINT_LIST_LIST; INTEGER N; REF(HEAD) V_RANGE; REF(HEAD) V_LISTS; V_RANGE :- NEW HEAD; V_LISTS :- SUBSETS(V_RANGE); PRINT_LIST_LIST(V_LISTS); OUTIMAGE; FOR N := 1 STEP 1 UNTIL 4 DO BEGIN NEW LOF_INT(N).INTO(V_RANGE); V_LISTS :- SUBSETS(V_RANGE); PRINT_LIST_LIST(V_LISTS); OUTIMAGE; END; END.