{ File: inslett.pas }

{ Scopo: realizzazione del tipo di dato astratto
         "insieme di lettere alfabetiche maiuscole"
         tramite vettore caratteristico }

type
  TipoLettera    = 'A'..'Z';
  TipoInsLettere = array [TipoLettera] of boolean; { vettore caratteristico }


procedure InitInsLettere (var ins: TipoInsLettere);
{ Inizializza l'insieme di lettere ins all'insieme vuoto ponendo a FALSE tutti
  gli elementi. }
var
  ch : TipoLettera;
begin
  for ch := 'A' to 'Z' do
    ins[ch] := FALSE
end; { InitInsLettere }


function TestInsiemeVuoto (ins: TipoInsLettere): boolean;
{ Restituisce TRUE se ins rappreseta l'insieme vuoto, FALSE altrimenti. }
var
  ch : TipoLettera;
begin
  TestInsiemeVuoto := TRUE;
  for ch := 'A' to 'Z' do
    if ins[ch] then
      TestInsiemeVuoto := FALSE
end; { TestInsiemeVuoto }


procedure InserisciLettera (var ins: TipoInsLettere; lettera: TipoLettera);
{ Inserisce lettera nell'insieme di lettere ins. }
begin
  ins[lettera] := TRUE
end; { InserisciLettera }


procedure EliminaLettera (var ins: TipoInsLettere; lettera: TipoLettera);
{ Elimina lettera dall'insieme di lettere ins. }
begin
  ins[lettera] := FALSE
end; { EliminaLettera }


function VerificaAppartenenza (ins     : TipoInsLettere;
                               lettera : TipoLettera): boolean;
{ Restituisce TRUE se lettera appartiene ad ins, FALSE altrimenti. }
begin
  VerificaAppartenenza := ins[lettera]
end; { VerificaAppartenenza }


procedure Unione (ins1, ins2: TipoInsLettere; var ins_unione: TipoInsLettere);
{ Restituisce in ins_unione l'unione dei due insiemi ins1 e ins2. }
var
  ch : TipoLettera;
begin
  for ch := 'A' to 'Z' do
    ins_unione[ch] := ins1[ch] or ins2[ch]
end; { Unione }


procedure Intersezione (ins1, ins2: TipoInsLettere; var ins_int: TipoInsLettere);
{ Restituisce in ins_int l'intersezione dei due insiemi ins1 e ins2. }
var
  ch : TipoLettera;
begin
  for ch := 'A' to 'Z' do
    ins_int[ch] := ins1[ch] and ins2[ch]
end; { Intersezione }


procedure Complemento (ins: TipoInsLettere; var ins_compl: TipoInsLettere);
{ Restituisce in ins_compl il complemento dell'insieme ins. }
var
  ch : TipoLettera;
begin
  for ch := 'A' to 'Z' do
    ins_compl[ch] := not ins[ch]
end; { Complemento }