Смекни!
smekni.com

Некоторые способы разбиения множеств (стр. 3 из 3)

Pot^.next:=nil; {указываем, что это понятие последнее в списке}

Pot^.p:=I {указываем количество элементов, содержащихся в понятии}

End

End;

Forj:=k1-1 downto 2 dobegin {k1 сейчас показывает количество подпонятий последнего понятия плюс 1. Поэтому в этом цикле, который попытается определить следующую комбинацию понятий и используется переменная k1. Эта часть программы рассматривает случай, когда подпонятия будут ставать не следующими по списку подпонятиями (по крайней мере не все), а будут происходить другие переходы. То есть этот цикл рассчитан на то, чтобы не позволить подпонятию с большим номером по списку в понятии быть большим по абсолютному адресу (по времени создания)}

If (str1[j]^.next=str1[j-1]) and (str1[j+1]=str1[j]) or ((j=k1-1) and (str1[j]<>

Str1[j-1])) thenbegin {если за подпонятием с номером jпо списку следует подпонятие с номером j-1 и подпонятия с номером jи j+1 совпадают, или jравно количеству подпонятий и последние два понятия совпадают (сравнение идет по абсолютным адресам расположения понятий в памяти), то}

str1[j]:=str1[j]^.next; {подпонятие с номером jпереходит на следующее за списком подпонятие}

Forj:=J+1 tok1-1 dostr1[j]:=f; {а все следующие подпонятия, становятся равными первому (элементарному) подпонятию}

gotomet {хотя применение оператора безусловного перехода считается плохим стилем программирования, но здесь он оправдан, дабы не запутывать программу новыми циклами}

End;

End;

Forj:=k1-1 downto 2 dobegin {новый цикл, который переключит соответствующие подпонятия. Мы выделяем это в новый цикл, так как нужно было проверить на наличие “граничных” переходов (см. предыдущий цикл)}

Ifstr1[j]<>str1[j-1]thenbegin { если подпонятия с номерами jи (j-1) не совпадают, то}

Str1[j]:=str1[j]^.next; {подпонятие с номером j становится следующим по списку (времени создания подпонятием)}

Forj:=j+1 tok1 dostr1[j]:=f; {а все идущие за ним подпонятия в списке подпонятий, составляющих понятие становятся элементарными}

gotomet {выходим из цикла}

End

End;

Str1[1]:=str1[1]^.next; {если не выполнились условия предыдущих двух циклов, то пора переключать первое подпонятие}

forj:=2 toidostr1[j]:=f; {и, соответствено, следующие подпонятия сделать элементарными}

Met: end

End;

Close(fil);{закрытьфайл}

Repeat {и}

Pot:=f^.next;

Dispose(f); {освободить память, занимаемую списком всех возможных подпонятий}

F:=pot

Until f<>nil

end.

Литература

1. В. Липский, Комбинаторика для программистов, пер. с польского, М. – Мир,1988