Wersja bazowa
Poniżej dowód własności \(\displaystyle{ A\cup B=B\cup A}\).
Kod: Zaznacz cały
PREDICATES eq{2} in{2}
SYMBOLS union{2}
AXIOMS
axiom_ext : forall A, forall B, (forall x, (x in A <-> x in B) -> A=B);
union_def : forall A, forall B, forall x, (x in union(A,B) <-> (x in A \/ x in B));
PROOF
FIX A,B
A1: forall x, (x in union(A,B) <-> x in union(B,A)) -> union(A,B)=union(B,A) INSTANT axiom_ext WITH union(A,B),union(B,A);
FIX x
B1: x in union(A,B) <-> (x in A \/ x in B) INSTANT union_def WITH A,B,x;
B2: x in union(B,A) <-> (x in B \/ x in A) INSTANT union_def WITH B,A,x;
x in union(A,B) <-> x in union(B,A) TAUTO p<->(a\/b), q<->(b\/a) |- p<->q FROM B1,B2;
HENCE
A2: forall x, (x in union(A,B) <-> x in union(B,A)) GEN;
union(A,B)=union(B,A) TAUTO p->q, p |- q FROM A1, A2;
HENCE
forall A, forall B, union(A,B)=union(B,A) GEN;
QEDJak wiadomo w logice pierwszego rzędu można ograniczyć się do kwantyfikatora ogólnego i dwóch spójników logicznych. W tym przypadku będą to negacja i implikacja. W prezentowanym kodzie używam innych spójników, ale oczywiście nie jest to konieczne.
Potrzebujemy jeszcze symboli relacyjnych i symboli funkcyjnych.
Kod zaczyna się od deklaracji wszystkich predykatów:
Kod: Zaznacz cały
PREDICATES eq{2} in{2}Deklarujemy, że nasz język zawiera symbol funkcyjny union o dwóch argumentach.
Kod: Zaznacz cały
SYMBOLS union{2}Kod: Zaznacz cały
AXIOMS
axiom_ext : forall A, forall B, (forall x, (x in A <-> x in B) -> A=B);
union_def : forall A, forall B, forall x, (x in union(A,B) <-> (x in A \/ x in B));Mamy teraz kilka metod wnioskowania:
1. TAUTO - podstawienie pod tautologię rachunku zdań. Schemat jest taki:
opcjonalna_etykieta : formuła TAUTO lista_przesłanek |- konkluzja FROM etykiety_przesłanek
W powyższym przykładzie
Kod: Zaznacz cały
union(A,B)=union(B,A) TAUTO p->q, p |- q FROM A1, A2;Literze p odpowaida formuła forall x, (x in union(A,B) <-> x in union(B,A)), która ma etykietę A2.
\(\displaystyle{ p\rightarrow q,p\vdash q}\) jest regułą w rachunku zdań.
2. INSTANT - podstawienie termu pod wolne wystąpienia zmiennej \(\displaystyle{ x}\) w formule postaci \(\displaystyle{ \forall x, \varphi(x)}\). Schemat:
opcjonalna_etykieta: formuła INSTANT etykieta_przesłanki WITH lista_termów
Przesłanka o danej etykiecie musi być postaci forall x1, ..., forall xn, ... gdzie n jest liczbą termów. Są one podstawiane w kolejności wypisania. Z tą regułą jest pewien problem, gdyż czasem takie bezpośrednie podstawienie może skutkować tym, że jakaś zmienna z podstawianego termu stanie się związana w powstałej formule. Wtedy trzeba najpiew dokonać podmiany zmiennych związanych.
3. GEN - generalizacja po zmiennych. Schemat
FIX lista_zmiennych
formuła 1;
...
formuła n;
HENCE forall x1,...,forall xk, formuła n GEN
Idea jest taka jak w dowodach nieformalnych: dowodząc jakieś zdanie typu 'dla każdego x', najpierw ustalamy x. Zasada jest taka, że w ogóle nie wolno używać zmiennych wcześniej nie ustalonych.
4. DEDUCT - dedukcja - implementacja twierdzenia o dedukcji znanego z logiki. Schemat:
ASSUME założenie;
formuła 1;
...
formuła n;
HENCE założenie -> formuła n DEDUCT
W powyższym dowodzie ta reguła nie była potrzebna, ale mam wrażenie, że jest konieczna (w przeciwieństwie do klasycznego systemu dowodzenia).
W najbliższym czasie postaram się opisać tutaj wersję rozszerzoną, która daje dużo większe możliwości. Co myślicie?
Ukryta treść:

