Boolesche Algebra mit SetlX

Dieser Code prüft, ob eine Operation auf einer Menge kommutativ ist:
istKommutativ := procedure(set,operation) {
   if (forall(x in set, y in set | operation(x,y) == operation(y,x))) {
      return true;
   } else {
      print ("nicht kommutativ");
      return false;
   }
};
Man kann folgendermaßen Operationen definieren:
und := procedure(a,b) { return a && b; };
oder := procedure(a,b) { return a || b; };
nicht := procedure(a) { return ! a; };
ifThen := procedure(a,b) { return !a || b; };
und dann testen, ob diese bezüglich einer Menge kommutativ sind, z.B.:
istKommutativ({false,true},und);
istKommutativ({false,true},oder);
Vervollständigen Sie den folgenden Code, so dass auch Assoziativität, Distributivität und Absorption überprüft werden. Testen Sie, ob Ihr Code die Rechenregeln für und und oder richtig erkennt und für ifThen ausgibt, dass es nicht assoziativ, nicht absorptiv und nicht distributiv ist.
istKommutativ := procedure(set,operation) {
   if (forall(x in set, y in set | operation(x,y) == operation(y,x))) {
      return true;
   } else {
      print ("nicht kommutativ");
      return false;
   }
};

istAssoziativ := procedure(set,operation) {
};

istDistributiv := procedure(set,operation1,operation2) {
};

istAbsorptiv := procedure(set,operation1,operation2) {
};

Dieser Code prüft, ob eine Operation bezüglich einer Menge ein neutrales Element (oder Identität) enthält. (Ein neutrales Element verändert den Wert des anderen Operanden nicht. Zum Beispiel ist 0 das neutrale Element der Addition, da x + 0 = x gilt.)
hatIdentitaet := procedure(set,operation,element) {
   if (forall(x in set | operation(x,element) == x)) {
      return true;
   } else {
      print ("keine Identitaet",set,operation,element);
      return false;
   }
};
Man kann den Code so einsetzen:
hatIdentitaet({false,true},oder,false);
hatIdentitaet({false,true},und,true);
Vervollständigen Sie den Code um einen Test für komplementäre (oder negierte) Elemente, der überprüft, dass x + ¬ x = 1 und x · ¬ x = 0. Testen Sie, ob Ihr Code die Komplemente für und und oder richtig erkennt und für ifThen mit nicht ausgibt, dass es keine Komplemente sind.
hatIdentitaet := procedure(set,operation,element) {
   if (forall(x in set | operation(x,element) == x)) {
      return true;
   } else {
      print ("keine Identitaet",set,operation,element);
      return false;
   }
};

hatKomplement := procedure(set,operation,unary_operation,element) {
};

Eine Boolesche Algebra kann jetzt so definiert werden:
istBooleanAlgebra:= procedure(set,eins,null,operat1,operat2,unary_operat){
    return eins in set && null in set &&
     istKommutativ(set,operat1) &&
     istKommutativ(set,operat2) &&
     istAssoziativ(set,operat1) &&
     istAssoziativ(set,operat2) &&
     istDistributiv(set,operat2,operat1) &&
     istDistributiv(set,operat1,operat2) &&
     istAbsorptiv(set,operat2,operat1) &&
     istAbsorptiv(set,operat1,operat2) &&
     hatIdentitaet(set,operat1,null) &&
     hatIdentitaet(set,operat2,eins) &&
     hatKomplement(set,operat1,unary_operat,eins) &&
     hatKomplement(set,operat2,unary_operat,null);
};
Überprüfen Sie, dass die Menge {true,false} mit den Operationen und, oder, nicht tatsächlich eine Boolesche Algebra ist.