OTTER- (ATP) Automated Theorem Prover Otter je razvijen u Argonne National Laboratory, USA. http://www.mcs.anl.gov/research/projects/AR/otter/ Više se ne radi na daljnjem razvoju, ali je stabilan i prikladan za projekte iz Ekspertnih sustava. Nasljednik je Prover9 (University of New Nexico, USA): http://www.cs.unm.edu/~mccune/prover9/ Tko želi može raditi i projekt uporabom Prover9 sustava za dokazivanje teorema ili bilo kojega drugog modernog sustava.
Otter Otter je sustav za dokazivanje teorema temeljen na predstavljanju znanja shemom predikatne logike prvoga reda. U rasuđivanju (izvođenju dokaza) koriste se razne izvedbe razrješavanja (Robinson 1965). Ugrađeno je preslikavanje formula predikatne logike u normalizirane klauzule jer interni rad isključivo s klauzulama. Opis problema može se dati kao skup formula predikatne logike ili kao skup klauzula. Ugrađeni su postupci podrazumijevanja, faktoriziranja, demodulacije. Može se koristiti za probleme s jednakosti. Implementiran je u ANSI C jeziku. Otter traži interakciju korisnika (postavljanje i mijenjanje početnih uvjeta rada). Otter nije pogodan za probleme iz matematičke teorije brojeva (indukcija). Za probleme verifikacije digitalnih sustava postoje specijalizirani sustavi koji su efikasniji od Otter-a.
Otter Temeljni postupak strategije je SOS (engl. Set of Support). Postoje četiri liste klauzula: usable, sos, passive, demodulators Glavna petlja: While (sos is not empty and no refutation found) 1. Let given_clause be the ‘‘best’’ clause in sos; 2. Move given_clause from sos to usable; 3. Infer and process new clauses using the inference rules in effect; each new clause must have the given_clause as one of its parents and members of usable as its other parents; new clauses that pass the retention tests are appended to sos; End of while loop.
Otter Osim temeljne SoS strategije postoje: - Weighting (introducing background knowledge) - Unit preference - Queue strategy (instead of weight use ordering in KB) - Prolog Notacija u klauzulama: PREDICATE(<constants>, <variables>, <functions>) Constants: Kim, apple, a, … Variables: u, v, x, y, z Functions: foo(<constants>, <variables>, <functions>) Negation: - Disjunction: | First-order: all x, exists x, -, &, |, ->, <->
Otter Pravila razrješavanja: 1. Binary resolution (klasični Robinson). 2. UR-resolution Jedna klauzula nejedinična + skup jediničnih. Simultano binarno razrješavanje sa skupom jediničnih. Rezultat: jedna jedinična. 3. Hyperresolution Skup klauzula od kojih je jedna negativna ili miješana (nukleus). (nucleus). Sve druge su pozitivne (sateliti). Broj of neg. literalla u nukleusu = broju satelita, u kojima je točno jedan odgovarajući pozitivan literal. 4. Negative hyperresolution, obrnuto od 3. 5. Unit resolution Binarno kao 1, jedna klauzula je jedinična. Pravila pojednostavljivanja: 1. Factoring (faktoriziranje) Izjednačavanje (unifikacija) i izbacivanje literala u klauzuli. 2. Subsumption (podrazumijevanje) Forward = nova klauzula se izbacuje (podrazumijevana) Backward = stara klauzula se izbacuje (podrazumijevana)
Otter Korisničko sučelje: Otvori se terminal mod (Windows “command prompt”). otter < input-file > output-file input-file: foo.in output-file: foo.out Nema parametara u naredbenoj liniji (sve je u ulaznoj datoteci). Ulazna ASCII tekst datoteka: skup wff formula predikatne logike ili skup klauzula, znak % za komentar Rezultat će biti zapisan u izlaznu datoteku. <, > znakovi: uobičajeno usmjeravanje kao u Unix-u.
Otter - primjer % Roberta and Steve hold, between them, two jobs. % Each has one job. % The jobs are teacher and nurse. % The job of nurse is held by a male. % Who holds each job? %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % define inference, usually set(auto). set(ur_res).
Otter - primjer % Describe the world by “usable” list. list(usable). % Everyone is a male or a female. FEMALE(x) | MALE(x). % No person is both male and female. % not exist x (male(x) and female(x) = % for all (-male(x) | -female(x) -FEMALE(x) | -MALE(x). % Every person holds exactly one of job, and % every job is held by one person. % The jobs are nurse and teacher. HASAJOB(x, nurse) | HASAJOB(x, teacher). % Noone can have both jobs. -HASAJOB(x, nurse) | -HASAJOB(x, teacher). % Every job is assigned to Roberta or Steve. HASAJOB(Roberta, x) | HASAJOB(Steve, x). % Roberta and Steve cannot have the same job. -HASAJOB(Roberta, x) | -HASAJOB(Steve, x).
Otter - primjer % The job of a nurse is held by a male. % for all x, if x has a job of a nurse, % then x is a male % for all x HASAJOB(x, nurse) -> MALE(x) -HASAJOB(x, nurse) | MALE(x). % Roberta is a female. FEMALE(Roberta). % Steve is a male. MALE(Steve). end_of_list. % Prove or not that Steve is a nurse (sos list). list(sos). -HASAJOB(Steve, nurse).
Otter - primjer ----- Otter 3.0.4, August 1995 ----- The job was started by ??? on ???, Tue Oct 19 12:36:35 1999 The command was "winot304". set(ur_res). list(usable). 1 [] FEMALE(x)|MALE(x). 2 [] -FEMALE(x)| -MALE(x). 3 [] HASAJOB(x,nurse)|HASAJOB(x,teacher). 4 [] -HASAJOB(x,nurse)| -HASAJOB(x,teacher). 5 [] HASAJOB(Roberta,x)|HASAJOB(Steve,x). 6 [] -HASAJOB(Roberta,x)| -HASAJOB(Steve,x). 7 [] -HASAJOB(x,nurse)|MALE(x). 8 [] FEMALE(Roberta). 9 [] MALE(Steve). end_of_list. list(sos). 10 [] -HASAJOB(Steve,nurse). ======= end of input processing =======
Otter - primjer =========== start of search =========== given clause #1: (wt=3) 10 [] -HASAJOB(Steve,nurse). ** KEPT (pick-wt=3): 11 [ur,10,5] HASAJOB(Roberta,nurse). ** KEPT (pick-wt=3): 12 [ur,10,3] HASAJOB(Steve,teacher). given clause #2: (wt=3) 11 [ur,10,5] HASAJOB(Roberta,nurse). ** KEPT (pick-wt=2): 13 [ur,11,7] MALE(Roberta). ** KEPT (pick-wt=3): 14 [ur,11,4] -HASAJOB(Roberta,teacher). given clause #3: (wt=2) 13 [ur,11,7] MALE(Roberta). ** KEPT (pick-wt=2): 15 [ur,13,2]). -FEMALE(Roberta ----> UNIT CONFLICT at 0.01 sec ----> 16 [binary,15.1,8.1] $F. Length of proof is 3. Level of proof is 3.
Otter - primjer ---------------- PROOF ---------------- 2 [] -FEMALE(x)| -MALE(x). 5 [] HASAJOB(Roberta,x)|HASAJOB(Steve,x). 7 [] -HASAJOB(x,nurse)|MALE(x). 8 [] FEMALE(Roberta). 10 [] -HASAJOB(Steve,nurse). 11 [ur,10,5] HASAJOB(Roberta,nurse). 13 [ur,11,7] MALE(Roberta). 15 [ur,13,2] -FEMALE(Roberta). 16 [binary,15.1,8.1] $F. ------------ end of proof ------------- Search stopped by max_proofs option. ============ end of search ============
Otter - primjer -------------- statistics ------------- clauses given 3 clauses generated 6 ur_res generated 6 demod & eval rewrites 0 clauses wt,lit,sk delete 0 tautologies deleted 0 clauses forward subsumed 1 unit deletions 0 factor simplifications 0 clauses kept 5 new demodulators 0 empty clauses 1 clauses back demodulated 0 clauses back subsumed 0 usable size 12 sos size 3 demodulators size 0 passive size 0 hot size 0 Kbytes malloced 63
Otter - primjer Varijacija primjera: želimo oba rješenja (Who holds each job?) Default: assign(max_proofs, 1) – sustav stane kod prvog dokaza Dodajemo: (database inquiry). assign(maxproofs, 2). list(usable). % sve klauzule kao prije . . . % dodaj: “ako poslovi stavi u bazu”, implikacija -HASAJOB(x, y) | INFO(x, y). end_of_list. list(passive). % dodaj za ispis, implikacija -INFO(x, y) | $ANSWER(HASAJOB(x, y)).
Otter - primjer Varijacija primjera: želimo oba rješenja (Who holds each job?) Rezultat: $ANSWER(HASAJOB(steve, nurse)). $ANSWER(HASAJOB(roberta, teacher)).