Has-Quality, represented in Lisp lists as follows: (Reacts Inputs {reactant1 reactant2 ...} Outputs {product1 product2 ...}) (Has-Quality Object {substance} quality {value}) For their experiment the authors used the following facts: (Reacts Inputs {HCl NaOH} Outputs {NaCl}) (Reacts Inputs {HCl KOH} Outputs {KCl}) (Reacts Inputs {HNO3 NaOH} Outputs {NaNO3}) (Reacts Inputs {HNO3 KOH} Outputs {KNO3 }) (Has-Quality Object {HCl} Tastes {Sour}) (Has-Quality Object {HNO3} Tastes {Sour }) (Has-Quality Object {NaOH} Tastes {Bitter}) (Has-Quality Object {KOH} Tastes {Bitter}) (Has-Quality Object {NaCl} Tastes {Salty}) (Has-Quality Object {NaNO3} Tastes {Salty}) (Has-Quality Object {KCl} Tastes {Salty}) (Has-Quality Object {KNO3} Tastes {Salty}) Discovering the following law and equivalence classes: Salts: {KNO3, KCl, NaNO3, NaCl} Acids: {HCl, HNO3} Alkalis: {NaOH, KOH} ∀ alkali ∀ acid ∃ salt (Reacts Inputs {acid, alkali} Outputs {salt}) ∀ salt (Has-Quality Object {salt} Tastes {Salty}) ∀ acid (Has-Quality Object {acid} Tastes {Sour}) ∀ alkali (Has-Quality Object {alkali} Tastes {Bitter}) The modern notation with strings like: NaOH, HCl, etc., is used just as short substance names. Here they do not mean the chemical structure of the substances, which was not known at the time of the discovery; the program works with any name used in the 17th century like aqua regia, muriatic acid, etc. Procedures Glauber is based in two procedures: Form-Class and Determine-Quantifier. The procedure Form-Class generalize the Reacts predicates by replacing the substance names by variables ranging on equivalence classes determined by a quality whose value distinguishes the substances in each class. In the experiment designed by its authors, the substances are partitioned in three classes based in the value of the taste quality based on their values: acids (sour), alkalis (bitter) and salts (salty). Glauber main procedure Input: Reacts and Has-Quality predicate sets Output: On success returns a generalized version of the Reacts predicate whose variables range over the equivalence classes and a new Class predicate which is like Has-Quality having a name-class instead of substance name: (Has-Quality {class-name} quality {value}) If there are no more substance names in the Reacts predicates then finish process the Reacts predicates with the Form-Class procedure process the result of the previous step with Determine-Quantifier go to step 3 Form-Class Input: the Reacts and Has-Quality predicate sets Output: a new substances class, a new Has-Quality and a new Reacts predicate set Count the number of occurrences of each quality {value} in the Has-Quality predicates Select the quality value with the largest number of occurrences,