124 lines
3.6 KiB
Plaintext
124 lines
3.6 KiB
Plaintext
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.
|