Niestandardowy model liczb naturalnych: Różnice pomiędzy wersjami
(Nie pokazano 8 pośrednich wersji utworzonych przez tego samego użytkownika) | |||
Linia 3: | Linia 3: | ||
Czego dowodzi ten przykład? | Czego dowodzi ten przykład? | ||
− | Do udowodnienia poprawności algorytmu Euklidesa potrzebny jest inny zestaw własności (''inaczej'', niezmienników, aksjomatów) liczb naturalnych. Poniżej przytoczone specyfikacje <ref>''inaczej'', interfejsy, aksjomatyzacje</ref> Nat i Nat2 liczb naturalnych nie wystarczają. | + | 1° Do udowodnienia poprawności algorytmu Euklidesa potrzebny jest inny zestaw własności (''inaczej'', niezmienników, aksjomatów) liczb naturalnych. Poniżej przytoczone specyfikacje <ref>''inaczej'', interfejsy, aksjomatyzacje</ref> Nat i Nat2 liczb naturalnych nie wystarczają. |
+ | |||
+ | 2° Model niestandardowy może być programowalny. (że nie zawsze tak jest dowodzi | ||
+ | |||
+ | ::'''Twierdzenie''' Tennenbauma: | ||
+ | ::''Jeśli model arytmetyki z dodawaniem i mnożeniem jest programowalny, to jest modelem standardowym''. | ||
------ | ------ | ||
Linia 61: | Linia 66: | ||
Dowód można znaleźć w książce Andrzeja Grzegorczyka. | Dowód można znaleźć w książce Andrzeja Grzegorczyka. | ||
+ | == Przykład wykazujący, że algorytm Euklidesa w modelu niestandardowym nie zatrzymuje się. == | ||
+ | |||
+ | Po pierwsze, trzeba nasz algorytm przepisać tak by jego środowiskiem była klasa NSN. Nie jest to trudne. | ||
+ | (* Algorytm Euklidesa inaczej, zauważ, że w tym algorytmie jedyna operacja jest dodaj jeden, jedynym predykatem jest równość. *) | ||
+ | |||
+ | (* Dane: x>0 i y>0 liczby naturalne *) | ||
+ | ::<math>\color{blue}\mathbf{Deklaracje: }\ typ(x, y, n, m, r, q, max)=NSN\ \land\ typ(n\_mniejsze)=Boolean </math> | ||
+ | (* Wynik: nwd(x,y) *) | ||
+ | |||
+ | n:=x; m:=y; | ||
+ | |||
+ | '''while''' not n.isequal(m) | ||
+ | '''do''' | ||
+ | ::<math>\color{red}\mathbf{Oznaczenie}\ niech\ l=max(n,m) </math> | ||
+ | :r:=0; | ||
+ | :'''while''' not r.isequal(n) '''and''' not r.isequal(m) | ||
+ | :'''do''' | ||
+ | ::r:=r.add(one) | ||
+ | :'''od'''; | ||
+ | :'''if''' r.isequal(n) '''then''' n_miejsze:=true; max:=m '''else''' n_mniejsze:=false; max:=n '''fi'''; | ||
+ | ::<math>\color{blue}\mathbf{Stwierdzenie}\ (n<m \wedge m=max(n,m) \vee m<n \wedge n=max(n,m)) </math> | ||
+ | :q:=0; | ||
+ | :'''while''' not r.isequal(max) | ||
+ | :'''do''' | ||
+ | ::r:= r.add(one); q:=q.add(one) | ||
+ | :'''od'''; | ||
+ | ::<math>\color{blue}\mathbf{Stwierdzenie}\ q = |m-n| \land (1 \leq q < max(n,m))\land r=max(n,m) </math> | ||
+ | :'''if''' n_mniejsze '''then''' m:=q '''else''' n := q '''fi''' | ||
+ | ::<math>\color{blue}\mathbf{Stwierdzenie}\ max(n,m) < \color{red}l </math> | ||
+ | '''od''' | ||
+ | ( ''wynik'' = n) | ||
+ | |||
+ | |||
+ | Niech | ||
+ | |||
+ | x:= new NSN(12,0,1); | ||
+ | y := new NSN(15, 1,2); | ||
+ | |||
+ | Teraz, spróbujmy obliczyć NWD(x,y). | ||
+ | Łatwo widać, że w tym przypadku obliczenie będzie nieskończone lub bardziej realistycznie: obliczenie może być kontynuowane dowolnie długo. | ||
== Przypisy == | == Przypisy == | ||
− | <references | + | <references/> |
Aktualna wersja na dzień 10:35, 7 mar 2013
Klasa NSN przytoczona poniżej spełnia aksjomaty liczb naturalnych z operacją dodawania, ale wykonywanie algorytmu Euklidesa w środowisku zdefiniowanym przez tę klasę nie zawsze kończy się po skończonej liczbie kroków.
Czego dowodzi ten przykład?
1° Do udowodnienia poprawności algorytmu Euklidesa potrzebny jest inny zestaw własności (inaczej, niezmienników, aksjomatów) liczb naturalnych. Poniżej przytoczone specyfikacje [1] Nat i Nat2 liczb naturalnych nie wystarczają.
2° Model niestandardowy może być programowalny. (że nie zawsze tak jest dowodzi
- Twierdzenie Tennenbauma:
- Jeśli model arytmetyki z dodawaniem i mnożeniem jest programowalny, to jest modelem standardowym.
program NonstandardNaturalNumbers;
- unit NSN: Nat class(cecha,licznik, mianownik: integer);
- unit virtual add: function(m: NSN) : NSN;
- begin
- result:= new NSN(cecha+m.cecha, licznik*m.mianownik+mianownik*m.licznik)
- end add;
- unit virtual isequal: function(n: NSN): Boolean;
- begin
- result := (cecha=m.cecha) and (licznik*m.mianownik=mianownik*m.licznik)
- end isequal;
- begin
- if licznik=0 and cecha <0 then raise Exception fi;
- if licznik < 0 then raise Exception fi;
- if mianownik =0 then raise Exception fi
- end NSN;
- unit Nat: class; (* specyfikacja 1sza *)
- unit virtual add: function(x:Nat): Nat; end add;
- unit virtual isequal: function(x:Nat): Boolean; end isequal;
- (* -------------------------------------------------------- *)
- (* forall n in Nat, not( n.add(one).isequal(zero)
- forall n,m in Nat not n.isequal(m) implies not n.add(one).isequal(m.add(one))
- dla kazdej formuły alpha(x)
- {alpha(x/zero) and forall n [alpha(n) implies alpha(n.add(one))]} implies forall n alpha(n)
- *)
- end Nat;
- unit Nat2: class; (* specyfikacja 2sza *)
- unit virtual add: function(x:Nat): Nat; end add;
- unit virtual isequal: function(x:Nat): Boolean; end isequal;
- (* INVARIANTS *)
- (* -------------------------------------------------------- *)
- (* forall n in Nat, not( n.add(one).isequal(zero)
- forall n,m in Nat not n.isequal(m) implies not n.add(one).isequal(m.add(one))
- INNY SCHEMAT zob. A. Grzegorczyk Zarys Arytmetyki Teoretycznej, PWN, Warszawa, 1971, str.239
- *)
- end Nat2;
- (* Tw. Te dwie specyfikacje są równoważne i zupełne *)
- var (* final *) zero, one: Nat;
begin (* main *)
- zero := new NSN(0, 0,1);
- one := new NSN(1,0,1);
end
Twierdzenie Zbiór obiektów klasy NSN wraz z metodami .add i .isequal spełnia aksjomaty liczb naturalnych z dodawaniem, w tym wszystkie formuły schematu indukcji.
Dowód można znaleźć w książce Andrzeja Grzegorczyka.
Przykład wykazujący, że algorytm Euklidesa w modelu niestandardowym nie zatrzymuje się.
Po pierwsze, trzeba nasz algorytm przepisać tak by jego środowiskiem była klasa NSN. Nie jest to trudne. (* Algorytm Euklidesa inaczej, zauważ, że w tym algorytmie jedyna operacja jest dodaj jeden, jedynym predykatem jest równość. *)
(* Dane: x>0 i y>0 liczby naturalne *)
- [math]\color{blue}\mathbf{Deklaracje: }\ typ(x, y, n, m, r, q, max)=NSN\ \land\ typ(n\_mniejsze)=Boolean [/math]
(* Wynik: nwd(x,y) *)
n:=x; m:=y;
while not n.isequal(m) do
- [math]\color{red}\mathbf{Oznaczenie}\ niech\ l=max(n,m) [/math]
- r:=0;
- while not r.isequal(n) and not r.isequal(m)
- do
- r:=r.add(one)
- od;
- if r.isequal(n) then n_miejsze:=true; max:=m else n_mniejsze:=false; max:=n fi;
- [math]\color{blue}\mathbf{Stwierdzenie}\ (n\ltm \wedge m=max(n,m) \vee m\ltn \wedge n=max(n,m)) [/math]
- q:=0;
- while not r.isequal(max)
- do
- r:= r.add(one); q:=q.add(one)
- od;
- [math]\color{blue}\mathbf{Stwierdzenie}\ q = |m-n| \land (1 \leq q \lt max(n,m))\land r=max(n,m) [/math]
- if n_mniejsze then m:=q else n := q fi
- [math]\color{blue}\mathbf{Stwierdzenie}\ max(n,m) \lt \color{red}l [/math]
od ( wynik = n)
Niech
x:= new NSN(12,0,1); y := new NSN(15, 1,2);
Teraz, spróbujmy obliczyć NWD(x,y). Łatwo widać, że w tym przypadku obliczenie będzie nieskończone lub bardziej realistycznie: obliczenie może być kontynuowane dowolnie długo.
Przypisy
- ↑ inaczej, interfejsy, aksjomatyzacje