Logika dla informatyków/Logika pierwszego rzędu. Sposób użycia: Różnice pomiędzy wersjami
Nie podano opisu zmian |
|||
Linia 176: | Linia 176: | ||
"''albo''" bywa czasem rozumiane w znaczeniu alternatywy wykluczającej. My jednak umawiamy się, że rozumiemy je tak samo | "''albo''" bywa czasem rozumiane w znaczeniu alternatywy wykluczającej. My jednak umawiamy się, że rozumiemy je tak samo | ||
jak "''lub''". | jak "''lub''". | ||
====Konfuzje składniowe==== | |||
Przy tłumaczeniu z języka polskiego na język logiki formalnej i na odwrót | |||
można łatwo popełnić błąd nawet wtedy gdy nie powstają problemy semantyczne. | |||
Składnia tych języków jest oparta na innych zasadach. Na przykład te dwa | |||
zdania mają bardzo podobną budowę: | |||
\begin{center}\it | |||
Każdy kot ma wąsy.\\ | |||
Pewien kot ma wąsy. | |||
\end{center} | |||
<!--% | |||
-->Ale ich tłumaczenia na język rachunku predykatów nie są już takie podobne: | |||
<!--% | |||
-->\begin{center}\it | |||
<math>\forall x(''Kot''(x) \to ''MaW\hspace{-1mm''\mbox''ą}sy''(x))</math>;\\ | |||
<math>\exists x(''Kot''(x) \wedge ''MaW\hspace{-1mm''\mbox''ą}sy''(x))</math>. | |||
\end{center} | |||
Dość częstym błędem jest właśnie mylenie koniunkcji z \rightarrowlikacją | |||
w zasięgu działania kwantyfikatora. A \leftrightarrow inny przykład: Zdania | |||
\hfil ''Liczba <math>n</math> jest parzysta;\/'' | |||
\hfil ''Liczba <math>n</math> jest dwukrotnością pewnej liczby\/'' | |||
oznaczają to samo. Zaprzeczeniem pierwszego z nich jest oczywiście | |||
zdanie | |||
\hfil ''Liczba <math>n</math> nie jest parzysta\/'', | |||
ale zaprzeczeniem drugiego nie jest zdanie | |||
\hfil ''Liczba <math>n</math> nie jest dwukrotnością pewnej liczby,\/'' | |||
otrzymane przecież przez analogiczną operację ,,podstawienia''. Użycie | |||
słowa ,,pewnej'' powoduje bowiem, że to zdanie rozumiemy jako | |||
<math>\exists x(\neg n=2x)</math>, a nie jako <math>\neg \exists x(n=2x)</math>. | |||
Innym popularnym błędem jest mylenie koniunkcji z alternatywą w przesłance | |||
\rightarrowlikacji, zwłaszcza gdy występuje tam negacja. Mamy bowiem skłonność do | |||
powtarzania słowa ,,nie'' w obu członach założenia i nie razi nas zdanie | |||
\hfil {\it Kto nie ma biletu lub nie jest pracownikiem teatru, ten nie | |||
wejdzie na przedstawienie.} | |||
Ale od tekstu matematycznego oczekujemy więcej ścisłości i w takim tekście | |||
zdanie: | |||
\hfil {\it Jeśli <math>x</math> nie jest równe <math>2</math> lub nie jest równe <math>3</math>, | |||
to <math>x^2-5x+6</math> nie jest zerem.} | |||
może wprowadzić czytelnika w błąd. ,,Dosłowne'' tłumaczenie tego zdania | |||
na język logiki predykatów, to przecież formuła | |||
\hfil <math>\neg(x=2)\vee \neg(x=3) \to \neg(x^2-5x+6 = 0)</math>, | |||
a nie formuła | |||
\hfil <math>\neg(x=2\vee x=3)\to \neg(x^2-5x+6 = 0)</math>. | |||
Wielu takich dwuznaczności\boldsymbol{s}}\def\blank{\hbox{\sf Bnikniemy, gdy | |||
przypomnimy sobie, że w języku polskim istnieją takie słowa jak | |||
''ani\/'' i ''żaden\/''. | |||
Język logiki pierwszego rzędu, dzięki możliwości\boldsymbol{s}}\def\blank{\hbox{\sf Bżywania kwantyfikatorów, | |||
jest dośćelastyczny. Można z jego pomocą wyrazić wiele nietrywialnych | |||
własności obiektów matematycznych. | |||
W szczególności interesować nas może ''definiowanie\/''elementów | |||
i wyodrębnianie struktur o pewnych szczególnych własnościach, czy też | |||
formułowanie kryteriów ''odróżniających\/'' | |||
jakieś struktury od innych. | |||
{{przyklad||drzwizamknela| | |||
Przypuśćmy, że sygnatura sk{ł}ada się z dwóch jednoargumentowych symboli | |||
relacyjnych <math>R</math> i <math>S</math>, | |||
dwuargumentowego symbolu funkcyjnego <math>f</math> i jednoargumentowego | |||
symbolu funkcyjnego <math>g</math>. Wtedy formuła | |||
<!--% | |||
--><center><math>\forall x\forall y(R(x)\wedge S(y)\to R(f(x,y))\wedge S(f(x,y))</math></center> | |||
<!--% | |||
-->jest prawdziwa dokładnie w tych modelach <math>\A = \<A, f^\A, g^\A, R^\A, S^\A\></math>, | |||
w których obraz iloczynu | |||
kartezjańskiego <math>R^\A\times S^\A</math> przy przekształceniu <math>f</math> zawiera | |||
się w zwykłym iloczynie \mbox{<math>R^\A\cap S^\A</math>}. | |||
}} | |||
{{przyklad||malpa| | |||
Teraz niech nasza sygnatura składa się z jednej operacji dwuargumentowej | |||
<math>\cdot</math> i z jednej stałej <math>\varepsilon</math>. Zdanie | |||
<!--% | |||
--></math></center>\exists x_1\exists x_2\forall y(\forall z_1\forall z_2(y=z_1\cdot z_2 \to | |||
y=z_1\vee y=z_2)\to y=x_1\vee y=x_2\vee y=\varepsilon)</math></center> | |||
<!--% | |||
-->jest prawdziwe w strukturze <math>\<\{a,b\}^*, \cdot, \varepsilon\></math> słów nad | |||
alfabetem <math>\{a,b\}^*</math> z konkatenacją i słowem pustym, | |||
ale nie w modelu słów nad alfabetem | |||
trzyliterowym <math>\<\{a,b,c\}^*, \cdot, \varepsilon\></math>. Inaczej mówiąc, nasze | |||
zdanie ''rozróżnia\/'' te dwie struktury. | |||
}} | |||
Niestety, konsekwencją znacznej siły wyrazu logiki pierwszego rzędu jest | |||
jej nierozstrzygalność. Dokładniej, nierozstrzygalny jest następujący | |||
problem decyzyjny:\footnote{W istocie, nazwa ,,problem decyzyjny'' | |||
(Entscheidungsproblem) została\boldsymbol{s}}\def\blank{\hbox{\sf Bżyta po raz pierwszy właśnie w tym | |||
kontekście.} {\it Czy dana formuła logiki pierwszego rzędu jest | |||
tautologią?\/} Aby wykazać, że tak jest, posłużymy się znaną nam | |||
nierozstrzygalnością problemu stopu dla maszyn Turinga. | |||
Przypomnijmy, że (deterministyczną, jednotaśmową) | |||
''maszynę Turinga nad alfabetem <math>\A</math>\/'' można zdefiniować | |||
jako krotkę <math>\M = \<\Delta, Q, \delta, q_0, q_a\></math>, gdzie: | |||
<!--% | |||
--> | |||
*<math>\Delta</math> jest skończonym alfabetem, zawierającym <math>\A</math> | |||
oraz symbol <math>\blank\not\in \A</math> (blank); | |||
*<math>Q</math> jest skończonym zbiorem ''stanów''; | |||
*<math>q_0\in Q</math> jest stanem ''początkowym''; | |||
*<math>q_f\in Q</math> jest stanem ''końcowym'' lub | |||
''akceptującym\/''; | |||
*<math>\delta :(Q -\{q_f\})\times\Delta \to \Delta\times Q\times\{-1,0,+1\}</math> | |||
jest ''funkcją przejścia''. | |||
Zakładając, że zbiory <math>\Delta</math> i <math>Q</math> są rozłączne, można zdefiniować | |||
''konfigurację\/'' maszyny jako słowo postaci <math>wqv</math>, gdzie <math>q\in Q</math> | |||
oraz <math>w,v\in\Delta^*</math>, przy czym\boldsymbol{s}}\def\blank{\hbox{\sf Btożsamiamy konfiguracje <math>wqv</math> | |||
i <math>wqv\blank</math>. | |||
<!--%% (Zawsze można więc zakładać, że słowo <math>v</math> nie kończy się blankiem.) | |||
-->Interpretacja tej definicji jest następująca. Taśma maszyny jest nieskończona | |||
w prawo. Na początku taśmy zapisane jest słowo <math>wv</math>, dalej w prawo | |||
są same blanki, a głowica maszyny ,,patrzy'' | |||
na pierwszy znak na prawo od <math>w</math>. Konfigurację | |||
postaci <math>\C_w = q_0w</math>, gdzie <math>w\in \A</math>, nazywamy ''początkową\/'', | |||
a konfigurację postaci <math>wq_fv</math> nazywamy ''końcową\/'' lub | |||
''akceptującą\/''. | |||
\bigbreak | |||
Relację <math>\to_\M</math> na konfiguracjach definiuje się tak: | |||
*Jeśli <math>\delta(q,a)=(b,p,+1)</math> to <math>wqav \to_\M wbpv</math>; | |||
*Jeśli <math>\delta(q,a)=(b,p,0)</math> to <math>wqav \to_\M wpbv</math>; | |||
*Jeśli <math>\delta(q,a)=(b,p,-1)</math> to <math>wcqav \to_\M wpcbv</math> | |||
oraz <math>qav\to_\M pbv</math> (gdy ruch w lewo jest niemożliwy.) | |||
Symbolem <math>\rarrow_\M</math> oznaczamy przechodnio-zwrotne domknięcie | |||
relacji <math>\to_\M</math>. Jeżeli <math>\C_w\rarrow_\M \C'</math>, gdzie <math>\C'</math> jest | |||
konfiguracją akceptującą to mówimy, że maszyna ''akceptuje\/'' słowo <math>w</math>. | |||
W naszej konstrukcji skorzystamy z następującej postaci problemu stopu: | |||
''Czy dana maszyna Turinga akceptuje słowo puste?'' Nietrudno jest | |||
zredukować do niego ogólny przypadek problemu stopu (ćwiczenie). | |||
Następujący lemat będzie przydatny w dowodzie nierozstrzygalności. | |||
\begin{lemat} <span id="nieKronecker" \> \parskip=2pt | |||
Niech <math>\vartheta</math> oznacza koniunkcję następujących formuł | |||
*<math>\forall y \neg P(y,c)</math> | |||
*<math>\forall x\exists y P(x,y)</math> | |||
*<math>\forall x\forall y (P(x,y)\to R(x,y))</math> | |||
*<math>\forall x\forall y\forall z(R(x,y)\to (R(y,z)\to R(x,z)))</math> | |||
*<math>\forall x\neg R(x,x)</math> | |||
Zdanie <math>\vartheta</math> jest spełnialne, a każdy jego model <math>\strA</math> | |||
zawiera nieskończony ciąg różnychelementów <math>c^\strA=a_0, a_1, a_2,\ldots</math>, | |||
takich że <math>(a_i,a_{i+1})\in P^\strA</math> dla każdego <math>i</math>. | |||
\end{lemat} | |||
{{dowod|| | |||
}} | |||
{{twierdzenie||entscheidungsproblem| | |||
Nie istnieje algorytm rozstrzygający czy dana formuła logiki pierwszego rzędu | |||
jest tautologią. | |||
}}{{dowod|| | |||
Naszym celem jestefektywna konstrukcja, która dla dowolnej maszyny | |||
Turinga <math>\M</math>\boldsymbol{s}}\def\blank{\hbox{\sf Btworzy formułę <math>\var\varphi_\M</math> o takiej własności: | |||
\hfil ''<math>\M</math> akceptuje słowo puste'' \quad \wtw, gdy\quad | |||
''<math>\var\varphi_\M</math> jest tautologią. '' | |||
Stąd natychmiast wynika teza twierdzenia. W przeciwnym razie | |||
taka konstrukcja pozwalałaby bowiem na rozstrzyganie problemu stopu. | |||
W istocie, wygodniej będzie skonstruować taką formułę <math>\psi_\M</math>, że | |||
\hfil ''<math>\M</math> zapętla się na słowie pustym'' | |||
\quad \wtw, gdy\quad ''<math>\psi_\M</math> jest spełnialna,'' | |||
i na koniec przyjąć <math>\var\varphi_\M=\neg \psi_\M</math>. Sygnatura naszej formuły | |||
będzie zależała od maszyny <math>\M</math> (bo tak jest łatwiej) chociaż tak być nie musi | |||
(Ćwiczenie [[#stalasygnatura]]). Składa się ona z: | |||
*jednoargumentowych symboli relacyjnych <math>S_q</math>, dla wszystkich | |||
stanów <math>q\in Q</math>; | |||
*dwuargumentowych symboli relacyjnych <math>C_a</math>, | |||
dla wszystkich symboli <math>a\in\Delta</math>; | |||
*dwuargumentowego symbolu relacyjnego <math>G</math>; | |||
*stałej <math>c</math> i symboli <math>P</math> i <math>Q</math> | |||
występujących w formule <math>\vartheta</math> z Lematu [[#nieKronecker]]. | |||
Formuła <math>\var\varphi_\M</math> jest koniunkcją złożoną z wielu składowych, które | |||
teraz opiszemy. Pierwszą składową jest formuła <math>\vartheta</math> | |||
z Lematu [[#nieKronecker]]. Każdy model tej formuły zawiera | |||
różnowartościowy ciąg <math>a_0, a_1, a_2,\ldots</math>, który posłuży nam | |||
jako substytut ciągu liczb naturalnych (oelemencie <math>a_i</math> myślimy | |||
jak o liczbie <math>i</math>). Intuicyjny sens formuł atomowych naszej | |||
sygnatury jest taki: | |||
*Formułę <math>S_q(x)</math> czytamy: po <math>x</math> krokach obliczenia | |||
maszyna jest w stanie <math>q</math>. | |||
*Formułę <math>G(x,y)</math> czytamy: po <math>x</math> krokach | |||
głowica maszyny znajduje się w pozycji <math>y</math>. | |||
*Formułę <math>C_a(x,y)</math> czytamy: po <math>x</math> krokach na pozycji | |||
<math>y</math> znajduje się symbol <math>a</math>. | |||
Dalsze składowe naszej formuły <math>\var\varphi_\M</math> są tak dobrane, aby każdy | |||
jej model reprezentował nieskończone obliczenie maszyny zaczynające | |||
się od słowa pustego. \Leftrightarrow te składowe: | |||
#<math>S_{q_0}(c)\wedge G(c,c)\wedge \forall x\,C_{\sf B}(c,x)</math>; | |||
#<math>\forall x(\bigvee_{q\in Q}S_q(x))</math>; | |||
#<math>\forall x(S_q(x)\to\neg S_{p}(x))</math>, dla <math>q,p\in Q</math>, <math>q\neq p</math>; | |||
#<math>\forall x\forall y(\bigvee_{a\in\Delta}C_a(x,y))</math>; | |||
#<math>\forall x\forall y(C_a(x,y)\to\neg C_b(x,y))</math>, dla <math>a,b\in\Delta</math>, | |||
<math>a\neq b</math>; | |||
#<math>\forall x\exists y\,G(x,y)</math>; | |||
#<math>\forall x\forall y\forall z(G(x,y)\wedge G(x,z)\to y=z)</math>; | |||
#</math>\forall x\forall y\forall z(S_q(x)\wedge G(x,y)\wedge C_a(x,y) | |||
\wedge P(x,z)\to S_p(z)\wedge C_b(z,y))</math>, gdy <math>\delta(q,a)=(p,b,i)</math>; | |||
#</math>\forall x\forall y\forall z(\neg G(x,y)\wedge C_a(x,y) \wedge P(x,z) | |||
\to C_a(z,y))</math>; | |||
#</math>\forall x\forall y\forall z\forall v(S_q(x)\wedge G(x,y)\wedge P(x,z) | |||
\wedge P(y,v)\to G(z,v))</math>, gdy <math>\delta(q,a)=(p,b,+1)</math>; | |||
#</math>\forall x\forall y\forall z(S_q(x)\wedge G(x,y)\wedge P(x,z) | |||
\to G(z,y))</math>, gdy <math>\delta(q,a)=(p,b,0)</math>; | |||
#</math>\forall x\forall y\forall z\forall v(S_q(x)\wedge G(x,y)\wedge P(x,z) | |||
\wedge P(v,y)\to G(z,v))</math>, gdy <math>\delta(q,a)=(p,b,-1)</math>; | |||
#</math>\forall x\forall y\forall z\forall v(S_q(x)\wedge G(x,c)\wedge P(x,z) | |||
\to G(z,c))</math>, gdy <math>\delta(q,a)=(p,b,-1)</math>; | |||
#<math>\forall x\neg S_{q_f}(x)</math>. | |||
Przypuśćmy teraz, że maszyna <math>\M</math> ma nieskończone obliczenie dla | |||
pustego słowa wejściowego. Zbudujemy model <math>\strA</math> dla | |||
formuły <math>\var\varphi_\M</math>. Dziedziną tego modelu jest zbiór <math>\NN</math> | |||
liczb naturalnych. Stałą <math>c</math> interpretujemy jako zero, relacja | |||
<math>P^\strA</math> to relacja następnika, a <math>R^\strA</math> to (ostra) relacja mniejszości. | |||
Relacje <math>S_q^\A</math>, <math>C_a^\A</math> i <math>G^\A</math> określamy zgodnie z ich intuicyjną | |||
interpretacją na podstawie przebiegu nieskończonego obliczenia maszyny. | |||
Nietrudno się przekonać, że wszystkie człony koniunkcji są prawdziwe | |||
w <math>\strA</math>, czyli zdanie <math>\var\varphi_\M</math> jest spełnialne. | |||
Przystąpmy więc do trudniejszej części dowodu. Załóżmy mianowicie, | |||
że <math>\strA\models\var\varphi_\M</math> dla pewnej struktury <math>\strA</math>. Wtedy także | |||
<math>\strA\models\vartheta</math>, niech więc | |||
<math>a_i</math> będąelementami <math>\strA</math>, o których mowa w Lemacie [[#nieKronecker]]. | |||
Struktura <math>\strA</math> spełnia też wszystkie pozostałe składowe | |||
formuły <math>\var\varphi_\M</math>. Składowe (2) i (3) gwarantują, że każdy zelementów | |||
<math>a_i</math> należy do dokładnie jednej z relacji <math>S_q</math>. Podobnie, każda para | |||
<math>(a_i,a_j)</math> należy do dokładnie jednej z relacji <math>C_a</math>, oraz każde <math>a_i</math> | |||
jest w relacji <math>G</math> z dokładnie jednymelementem struktury <math>\strA</math> --- tu | |||
używamy składowych (4)--(7). | |||
Rozpatrzmy obliczenie maszyny <math>\M</math> dla słowa pustego. Pokażemy, że jest | |||
to obliczenie nieskończone. | |||
Jeśli obliczenie maszyny <math>\M</math> składa się z co najmniej <math>n</math> kroków, | |||
to przez <math>q_n</math> oznaczmy stan, w którym znajduje się maszyna <math>\M</math> | |||
po wykonaniu tych <math>n</math> kroków, a przez <math>k_n</math> pozycję głowicy w tym | |||
momencie. Zawartością <math>m</math>-tej komórki taśmy po <math>n</math>-tym kroku obliczenia | |||
niech zaś będzie symbol <math>b_{nm}</math>. | |||
Przez indukcję \zwn <math>n</math> dowodzimy, że dla dowolnego <math>n\in\NN</math> | |||
obliczenie składa się z co najmniej <math>n</math> kroków, oraz: | |||
\hfil <math>a_n\in S_{q_n}^\strA</math>\qquad <math>(a_n,a_m)\in C_{b_{nm}}^\strA</math> | |||
\qquad<math>(a_n,a_{k_n})\in G^\strA</math>. | |||
Inaczej mówiąc, model <math>\strA</math> prawidłowo reprezentuje kolejne konfiguracje | |||
maszyny. Dla <math>n=0</math> powyższe związki wynikają wprost z prawdziwości członu (1) | |||
naszej koniunkcji. W kroku indukcyjnym skorzystamy | |||
przede wszystkim z członu (14), który gwarantuje, że stan <math>q_n</math> nie | |||
jest końcowy. Określona jest więc wartość funkcji przejścia | |||
<math>\delta(q_n,b_{mk_n})</math>. Możemy więc odwołać się do składowych | |||
(9--12), które zapewniają poprawną zmianę stanu i symbolu pod głowicą (8), | |||
zachowanie bez zmian reszty taśmy (9) i przesunięcie głowicy (10--12). | |||
Szczegóły dowodu pozostawiamy Czytelnikowi. | |||
}} | |||
Twierdzenie [[#entscheidungsproblem]] można wzmocnić, pokazując | |||
(Ćwiczenie [[#stalasygnatura]]), że problem jest nierozstrzygalny | |||
nawet dla formuł nad pewną\boldsymbol{s}}\def\blank{\hbox{\sf Bstaloną sygnaturą. W istocie, jest tak | |||
dla większości sygnatur, z wyjątkiem bardzo ,,ubogich'' przypadków. | |||
Dwa takie przypadki są przedmiotem Ćwiczeń [[#rJ1]] i [[#rJ2]] | |||
do Rozdziału [[#trzynasty]]. | |||
\subsection*{Ćwiczenia}\begin{small} | |||
#Stosując schematy ([[#trk6]]--[[#9]]) z Faktu [[#teerka]], | |||
pokazać, że następujące formuły są tautologiami: | |||
##</math>(\exists y p(y) \to \forall z q(z)) \to | |||
\forall y\forall z(p(y)\to q(z))</math>; %95b | |||
##</math>(\forall x\exists y r(x,y) \to \exists x\forall y r(y,x))\to | |||
\exists x\forall y(r(x,y) \to r(y,x))</math>; %99a | |||
##</math>\forall x\exists y((p(x)\to q(y))\to r(y)) | |||
\to ((\forall x p(x)\to \forall y q(y))\to \exists y r(y))</math>; %109a | |||
##</math>\forall x(p(x)\to \exists y q(y))\to | |||
\exists y(\exists x p(x)\to q(y))</math>.% 110a | |||
\item Jak rozumiesz następujące zdania? Jak je sformułować, żeby nie | |||
budziły wątpliwości? | |||
#''Nie wolno pić i grać w karty.'' | |||
#''Nie wolno pluć i łapać.'' | |||
#''Zabrania się zaśmiecania i zanieczyszczania drogi.''\footnote{Kodeks | |||
Drogowy przed nowelizacją w roku 1997.} | |||
#{\it Zabrania się zaśmiecania lub zanieczyszczania | |||
drogi.}\footnote{Kodeks Drogowy po nowelizacji w roku 1997.} | |||
#{\it Wpisać, gdy osoba\boldsymbol{s}}\def\blank{\hbox{\sf Bbezpieczona nie posiada numerów identyfikacyjnych | |||
NIP lub \mbox{PESEL}.}\footnote{Instrukcja wypełniania formularza ZUS ZCZA | |||
(Zgłoszenie danych o członkach rodziny\dots)} | |||
#{\it Podaj przykład liczby, która jest pierwiastkiem pewnego | |||
równania kwadratowego o współczynnikach | |||
całkowitych i takiej, która nie jest.} | |||
#''Warunek zachodzi dla każdego <math>x</math> i dla pewnego <math>y</math>.\/'' | |||
\item Czy następujące definicje można lepiej sformułować? | |||
#''Zbiór <math>A</math> jest {\sf dobry}, jeśli ma co najmniej 2elementy.'' | |||
#''Zbiór <math>A</math> jest {\sf dobry'', jeśli dla każdego <math>x\in A</math>, | |||
jeśli <math>x</math> jest parzyste, to <math>x</math> jest podzielne przez <math>3</math>.} | |||
#''Zbiór <math>A</math> jest {\sf dobry'', jeśli dla pewnego <math>x\in A</math>, | |||
jeśli <math>x</math> jest parzyste, to <math>x</math> jest podzielne przez <math>3</math>.} | |||
\item Wskazać błąd w rozumowaniu: | |||
#{\it Aby wykazać prawdziwość tezy\\ | |||
{\sf ,,Dla dowolnego <math>n</math>, jeśli | |||
zachodzi warunek <math>W(n)</math> to zachodzi warunek <math>U(n)</math>''}\\ | |||
załóżmy, że dla | |||
dowolnego <math>n</math> zachodzi <math>W(n)</math>\dots} | |||
#{\it Aby wykazać prawdziwość tezy\\ | |||
{\sf ,,Dla pewnego <math>n</math>, jeśli | |||
zachodzi warunek <math>W(n)</math> to zachodzi warunek <math>U(n)</math>''}\\ | |||
załóżmy, że dla | |||
pewnego <math>n</math> zachodzi <math>W(n)</math>\dots} | |||
\item Sformułować poprawnie zaprzeczenia stwierdzeń: | |||
*''Liczby <math>m</math> i <math>n</math> są pierwsze.'' | |||
*''Liczby <math>m</math> i <math>n</math> są względnie pierwsze.'' | |||
\item Czy zdanie {\it ,,Liczba <math>a</math> nie jest kwadratem pewnej liczby | |||
całkowitej''\/} | |||
jest poprawnym zaprzeczeniem zdania {\it ,,Liczba <math>a</math> jest kwadratem | |||
pewnej liczby całkowitej''\/}? | |||
\item | |||
Sygnatura <math>\Sigma</math> składa się z symboli | |||
<math>r, s \in \Sigma^R_1</math>, <math>R, S \in \Sigma^R_2</math> i <math>g\in \Sigma_2^F</math>. | |||
Napisać takie zdania <math>\var\varphi</math> i <math>\psi</math>, że:%61 jest rozwiazanie | |||
#zdanie <math>\var\varphi</math> jest prawdziwe dokładnie w tych modelach | |||
<math>\A = \<A, R^\A, S^\A, r^\A, s^\A, g^\A\></math>, | |||
w których obie relacje <math>R^\A</math>, <math>S^\A</math> | |||
są przechodnie, ale ich suma nie jest przechodnia; | |||
#zdanie <math>\psi</math> jest prawdziwe dokładnie w tych modelach | |||
<math>\A = \<A, R^\A, S^\A, r^\A, s^\A, g^\A\></math>, | |||
w których <math>s^\A</math> jest obrazem iloczynu | |||
kartezjańskiego <math>r^\A\times r^\A</math> przy funkcji <math>g^\A</math>. | |||
\item Sygnatura <math>\Sigma</math> składa się z dwuargumentowych symboli | |||
relacyjnych <math>r</math> i <math>s</math> oraz dwuargumentowego symbolu funkcyjnego <math>f</math>. | |||
Napisać (możliwie najkrótsze) zdanie, które jest prawdziwe dok{ł}adnie | |||
w tych modelach%77 jest rozwiazanie | |||
<math>\A = \<A, r^{\A}, s^{\A}, f^{\A}\></math>, w których: | |||
#Złożenie relacji <math>r^{\A}</math> i <math>s^{\A}</math> zawiera się w ich iloczynie | |||
<math>r^\A\cap s^\A</math>; | |||
#Zbiór wartości funkcji <math>f^{\A}</math> jest rzutem sumy <math>r^\A\cup s^\A</math> na | |||
pierwszą współrzędną; | |||
#Relacja <math>r^\A</math> nie jest funkcją z <math>A</math> w <math>A</math>; | |||
#Obraz <math>r^\A</math> przy funkcji <math>f^\A</math> jest podstrukturą w <math>\A</math>; | |||
#Obraz zbioru <math>A\times A</math> przy funkcji <math>f^\A</math> jest pusty. | |||
\item | |||
Dla każdej z par struktur: | |||
#<math>\<\NN,\leq\></math> i <math>\<\{m-{1\over n}\ |\ m,n\in\NN-\{0\}\}, \leq\></math>; | |||
#<math>\<\NN, +\></math> i <math>\<\ZZ, +\></math>; | |||
#<math>\<\NN, \leq\></math> i <math>\<\ZZ, \leq\></math>, | |||
wskaż zdanie prawdziwe w jednej z nich a w drugiej nie. | |||
\item Napisać takie zdania <math>\var\varphi</math> i <math>\psi</math>, że: | |||
#zdanie <math>\var\varphi</math> jest prawdziwe w modelu <math>\A = \<\ZZ, +, 0 \></math>, | |||
ale nie w modelu <math>\B = \<\NN, +, 0 \></math>; | |||
#zdanie <math>\psi</math> jest prawdziwe w modelu <math>\B = \<\ZZ, +, 0 \></math>, | |||
ale nie w modelu <math>\C = \<\QQ, +, 0 \></math>. | |||
\item Wskazać formułę pierwszego rzędu: | |||
#spełnialną w | |||
ciele liczb rzeczywistych ale nie w ciele liczb wymiernych; | |||
#spełnialną w algebrze <math>\NN</math> z mnożeniem, | |||
ale nie w algebrze <math>\NN</math> z dodawaniem; | |||
#spełnialną w <math>\<\{a,b\}^*,\cdot,\varepsilon\></math> | |||
ale nie w <math>\<\{a,b,c\}^*,\cdot,\varepsilon\></math>. | |||
\item <span id="bezrownosci" \> Zmodyfikować konstrukcję | |||
z dowodu Twierdzenia [[#entscheidungsproblem]] w ten sposób, | |||
aby w formule <math>\psi_\M</math> nie występował symbol równości | |||
ani stała </math>c<math>. %%{1. Napisać </math>\forall x\forall y\forall z(G(x,y)\wedge | |||
<!--%% R(y,z)\to \neg G(x,z))</math>.\quad | |||
--><!--%% 2. Użyć wszędzie prefiksu <math>\forall x(\forall y \neg P(y,x)\to \cdots)</math>.} | |||
-->\item <span id="stalasygnatura" \> Zmodyfikować konstrukcję | |||
z dowodu Twierdzenia [[#entscheidungsproblem]] w ten sposób, | |||
aby <math>\psi_\M</math> była zawsze formułą\boldsymbol{s}}\def\blank{\hbox{\sf Bstalonej sygnatury (niezależnej | |||
od maszyny <math>\M</math>). Wywnioskować stąd, że logika pierwszego rzędu | |||
nad tą\boldsymbol{s}}\def\blank{\hbox{\sf Bstaloną sygnaturą jest nierozstrzygalna. | |||
\end{small} |
Wersja z 21:52, 21 wrz 2006
Logika pierwszego rzędu. Sposób użycia.
Przyjrzyjmy się teraz kilku ważnym tautologiom.
Fakt
Następujące formuły są tautologiami (dla dowolnych Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi} i ).
- Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \forall x(\var\varphi\to\psi)\to(\exists x\var\varphi\to\exists x\psi)} ;
- , o ile ;
- ;
- ;
- ;
- ;
- ;
- ,o ile ;
- , o ile ;
- ;
- ;
- ;
- ;
Dowód
Formuły (1-3) powyżej wyrażają własności kwantyfikatora szczegółowego i są odpowiednikami formuł z Faktu 2.7. Zauważmy, że zamiast rozdzielności kwantyfikatora szczegółowego, mamy tu jeszcze jedno prawo rozkładu kwantyfikatora ogólnego. Zakłóca to nieco symetrię pomiędzy i , wyrażoną prawami de Morgana (4) i (4).
Kolejne dwie tautologie przypominają o bliskim związku kwantyfikatora ogólnego z koniunkcją i kwantyfikatora szczegółowego z alternatywą. (Uwaga: zmienna może być wolna w Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi} i .) Analogiczna rozdzielność kwantyfikatora ogólnego względem alternatywy (8) i kwantyfikatora szczegółowego względem koniunkcji (9) nie zawsze jest prawdą, ale zachodzi pod warunkiem, że zmienna wiązana kwantyfikatorem nie występuje w jednym z członów formuły. (Prawo (8) nazywane bywa prawem Grzegorczyka.)
Formuła (10) jest odbiciem naszego założenia o niepustości świata. Jest to tautologia, ponieważ umówiliśmy się, że rozważamy tylko struktury o niepustych nośnikach.
Prawa (11)--(13) charakteryzują możliwości permutowania kwantyfikatorów. Implikacja odwrotna do (13) zazwyczaj nie jest tautologią.
Stosując równoważności (4--[9) możemy każdą formułę sprowadzić do postaci, w której wszystkie kwantyfikatory znajdują się na początku.
Definicja 3.2
Mówimy, że formuła Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi} jest w preneksowej postaci normalnej, gdy
gdzie każde z to lub , a jest formułą otwartą. (Oczywiście może być zerem.)
Fakt 3.3
Dla każdej formuły pierwszego rzędu istnieje równoważna jej formuła w preneksowej postaci normalnej.
Dowód
Przykład 3.3
Formuła jest równoważna każdej z następujących formuł:
;
;
;
;
.
Logika formalna i język polski
Systemy logiki formalnej są, jak już mówiliśmy, tylko pewnymi modelami, czy też przybliżeniami rzeczywistych sposobów wyrażania różnych stwierdzeń i wnioskowania o ich poprawności. Poziom dokładności takich przybliżeń może być większy lub mniejszy. Większy tam, gdzie mamy do czynienia z dobrze określoną teorią matematyczną, lub językiem programowania. Mniejszy wtedy, gdy używamy logiki do weryfikacji poprawności stwierdzeń języka potocznego, choćby takiego jak podręcznikowy przykład: Janek idzie do szkoły. Oczywiście przypisanie temu stwierdzeniu wartości logicznej jest zgoła niemożliwe, nie wiemy bowiem, który Janek do jakiej ma iść szkoły i czy może już doszedł? Więcej sensu ma zastosowanie logiki predykatów do analizy np. takiego rozumowania:
Ale nie goli żadnego z tych, którzy golą się sami.
A zatem w Sewilli nie ma ani jednego cyrulika.
W tym przypadku aparat logiki formalnej może być pomocny. Łatwiej zrozumieć o co chodzi, tłumacząc nasz problem na język logiki
predykatów, i przedstawiając go jako pytanie o poprawność pewnego
stwierdzenia postaci Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \Gamma \models\var\varphi}
. Można więc zapytać, czy
Stwierdziwszy poprawność powyższego stwierdzenia, wywnioskujemy, że w Sewilli cyrulika nie ma. I będzie to wniosek ... błędny, bo cyrulik być może jest kobietą.
W powyższym przykładzie po prostu źle\boldsymbol{s}}\def\blank{\hbox{\sf Bstalono logiczną interpretację naszego zadania, zapominając o jednym z jego istotnychelementów. Błąd ten można łatwo naprawić, co jest zalecane jako ćwiczenie. Ale nie zawsze język logiki formalnej wyraża ściśle to samo, co p\leftrightarrowczny język polski, a nawet język w którym pisane są prace matematyczne. Zarówno składnia jak i semantyka tych języków rządzi się zupełnie innymi prawami, i o tym należy pamiętać tłumacząc jeden na drugi.
Implikacja materialna i związek przyczynowo-skutkowy
Implikacja, o której mówimy w logice klasycznej to tzw. implikacja materialna. Wartość logiczna, którą przypisujemy wyrażeniu Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi \to\psi} zależy wyłącznie od wartości logicznych przypisanych jego częściom składowym Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi} i . Nie zależy natomiast zupełnie od treści tych wyrażeń, czy też jakichkolwiek innych związków pomiędzy Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi} i . W szczególności, wypowiedzi Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi} i mogą mówić o zajściu jakichś zdarzeń i wtedy wartość logiczna implikacji Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi\to\psi} nie ma nic wspólnego z ichewentualnym następstwem w czasie, lub też z tym, że jedno z tych zdarzeń spowodowało drugie. W języku polskim stwierdzenie "jeśli Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi} to " oczywiście sugeruje taki związek, np. w zdaniu:
Tymczasem implikacja materialna nie zachodzi, o czym dobrze wiedzą użytkownicy terminali. Co więcej, w istocie materialną prawdą jest stwierdzenie odwrotne:
Natomiast zdanie
stwierdza nie tylko związek przyczynowo-skutkowy, ale też faktyczne zajście wymienionych zdarzeń i w ogóle nie ma odpowiednika w logice klasycznej.
Inne spójniki w mniejszym stopniu grożą podobnymi nieporozumieniami. Ale na przykład spójnik "i"" w języku polskim może też sugerować następstwo czasowe <ref name="szesc">W językach programowania jest podobnie, ale to już inna historia.</ref> zdarzeń: "Poszedł i zrobił." A wyrażenie "A, chyba że B" ma inny odcień znaczeniowy niż proste "A lub B". Przy tej okazji zwróćmy uwagę na to, że słowo "albo" bywa czasem rozumiane w znaczeniu alternatywy wykluczającej. My jednak umawiamy się, że rozumiemy je tak samo jak "lub".
Konfuzje składniowe
Przy tłumaczeniu z języka polskiego na język logiki formalnej i na odwrót można łatwo popełnić błąd nawet wtedy gdy nie powstają problemy semantyczne. Składnia tych języków jest oparta na innych zasadach. Na przykład te dwa zdania mają bardzo podobną budowę:
\begin{center}\it Każdy kot ma wąsy.\\ Pewien kot ma wąsy. \end{center} Ale ich tłumaczenia na język rachunku predykatów nie są już takie podobne: \begin{center}\it Parser nie mógł rozpoznać (błąd składni): {\displaystyle \forall x(''Kot''(x) \to ''MaW\hspace{-1mm''\mbox''ą}sy''(x))} ;\\ Parser nie mógł rozpoznać (błąd składni): {\displaystyle \exists x(''Kot''(x) \wedge ''MaW\hspace{-1mm''\mbox''ą}sy''(x))} . \end{center} Dość częstym błędem jest właśnie mylenie koniunkcji z \rightarrowlikacją w zasięgu działania kwantyfikatora. A \leftrightarrow inny przykład: Zdania
\hfil Liczba jest parzysta;\/
\hfil Liczba jest dwukrotnością pewnej liczby\/
oznaczają to samo. Zaprzeczeniem pierwszego z nich jest oczywiście zdanie
\hfil Liczba nie jest parzysta\/,
ale zaprzeczeniem drugiego nie jest zdanie
\hfil Liczba nie jest dwukrotnością pewnej liczby,\/
otrzymane przecież przez analogiczną operację ,,podstawienia. Użycie słowa ,,pewnej powoduje bowiem, że to zdanie rozumiemy jako , a nie jako .
Innym popularnym błędem jest mylenie koniunkcji z alternatywą w przesłance \rightarrowlikacji, zwłaszcza gdy występuje tam negacja. Mamy bowiem skłonność do powtarzania słowa ,,nie w obu członach założenia i nie razi nas zdanie
\hfil {\it Kto nie ma biletu lub nie jest pracownikiem teatru, ten nie wejdzie na przedstawienie.}
Ale od tekstu matematycznego oczekujemy więcej ścisłości i w takim tekście zdanie:
\hfil {\it Jeśli nie jest równe lub nie jest równe , to nie jest zerem.}
może wprowadzić czytelnika w błąd. ,,Dosłowne tłumaczenie tego zdania na język logiki predykatów, to przecież formuła
\hfil ,
a nie formuła
\hfil .
Wielu takich dwuznaczności\boldsymbol{s}}\def\blank{\hbox{\sf Bnikniemy, gdy przypomnimy sobie, że w języku polskim istnieją takie słowa jak ani\/ i żaden\/.
Język logiki pierwszego rzędu, dzięki możliwości\boldsymbol{s}}\def\blank{\hbox{\sf Bżywania kwantyfikatorów, jest dośćelastyczny. Można z jego pomocą wyrazić wiele nietrywialnych własności obiektów matematycznych. W szczególności interesować nas może definiowanie\/elementów i wyodrębnianie struktur o pewnych szczególnych własnościach, czy też formułowanie kryteriów odróżniających\/ jakieś struktury od innych.
Przykład
Przypuśćmy, że sygnatura sk{ł}ada się z dwóch jednoargumentowych symboli relacyjnych i , dwuargumentowego symbolu funkcyjnego i jednoargumentowego symbolu funkcyjnego . Wtedy formuła
jest prawdziwa dokładnie w tych modelach Parser nie mógł rozpoznać (nieznana funkcja „\A”): {\displaystyle \A = \<A, f^\A, g^\A, R^\A, S^\A\>} , w których obraz iloczynu kartezjańskiego Parser nie mógł rozpoznać (nieznana funkcja „\A”): {\displaystyle R^\A\times S^\A} przy przekształceniu zawiera się w zwykłym iloczynie \mbox{Parser nie mógł rozpoznać (nieznana funkcja „\A”): {\displaystyle R^\A\cap S^\A} }.
Przykład
Niestety, konsekwencją znacznej siły wyrazu logiki pierwszego rzędu jest jej nierozstrzygalność. Dokładniej, nierozstrzygalny jest następujący problem decyzyjny:\footnote{W istocie, nazwa ,,problem decyzyjny (Entscheidungsproblem) została\boldsymbol{s}}\def\blank{\hbox{\sf Bżyta po raz pierwszy właśnie w tym kontekście.} {\it Czy dana formuła logiki pierwszego rzędu jest tautologią?\/} Aby wykazać, że tak jest, posłużymy się znaną nam nierozstrzygalnością problemu stopu dla maszyn Turinga.
Przypomnijmy, że (deterministyczną, jednotaśmową) maszynę Turinga nad alfabetem Parser nie mógł rozpoznać (nieznana funkcja „\A”): {\displaystyle \A} \/ można zdefiniować jako krotkę Parser nie mógł rozpoznać (nieznana funkcja „\M”): {\displaystyle \M = \<\Delta, Q, \delta, q_0, q_a\>} , gdzie:
- jest skończonym alfabetem, zawierającym Parser nie mógł rozpoznać (nieznana funkcja „\A”): {\displaystyle \A}
oraz symbol Parser nie mógł rozpoznać (nieznana funkcja „\blank”): {\displaystyle \blank\not\in \A} (blank);
- jest skończonym zbiorem stanów;
- jest stanem początkowym;
- jest stanem końcowym lub
akceptującym\/;
jest funkcją przejścia.
Zakładając, że zbiory i są rozłączne, można zdefiniować
konfigurację\/ maszyny jako słowo postaci , gdzie
oraz , przy czym\boldsymbol{s}}\def\blank{\hbox{\sf Btożsamiamy konfiguracje
i Parser nie mógł rozpoznać (nieznana funkcja „\blank”): {\displaystyle wqv\blank}
.
Interpretacja tej definicji jest następująca. Taśma maszyny jest nieskończona
w prawo. Na początku taśmy zapisane jest słowo , dalej w prawo
są same blanki, a głowica maszyny ,,patrzy
na pierwszy znak na prawo od . Konfigurację
postaci , gdzie Parser nie mógł rozpoznać (nieznana funkcja „\A”): {\displaystyle w\in \A}
, nazywamy początkową\/,
a konfigurację postaci nazywamy końcową\/ lub
akceptującą\/.
\bigbreak Relację Parser nie mógł rozpoznać (nieznana funkcja „\M”): {\displaystyle \to_\M} na konfiguracjach definiuje się tak:
- Jeśli to Parser nie mógł rozpoznać (nieznana funkcja „\M”): {\displaystyle wqav \to_\M wbpv} ;
- Jeśli to Parser nie mógł rozpoznać (nieznana funkcja „\M”): {\displaystyle wqav \to_\M wpbv} ;
- Jeśli to Parser nie mógł rozpoznać (nieznana funkcja „\M”): {\displaystyle wcqav \to_\M wpcbv}
oraz Parser nie mógł rozpoznać (nieznana funkcja „\M”): {\displaystyle qav\to_\M pbv} (gdy ruch w lewo jest niemożliwy.)
Symbolem Parser nie mógł rozpoznać (nieznana funkcja „\rarrow”): {\displaystyle \rarrow_\M}
oznaczamy przechodnio-zwrotne domknięcie
relacji Parser nie mógł rozpoznać (nieznana funkcja „\M”): {\displaystyle \to_\M}
. Jeżeli Parser nie mógł rozpoznać (nieznana funkcja „\rarrow”): {\displaystyle \C_w\rarrow_\M \C'}
, gdzie jest
konfiguracją akceptującą to mówimy, że maszyna akceptuje\/ słowo .
W naszej konstrukcji skorzystamy z następującej postaci problemu stopu: Czy dana maszyna Turinga akceptuje słowo puste? Nietrudno jest zredukować do niego ogólny przypadek problemu stopu (ćwiczenie).
Następujący lemat będzie przydatny w dowodzie nierozstrzygalności.
\begin{lemat} \parskip=2pt Niech oznacza koniunkcję następujących formuł
Zdanie jest spełnialne, a każdy jego model Parser nie mógł rozpoznać (nieznana funkcja „\strA”): {\displaystyle \strA} zawiera nieskończony ciąg różnychelementów Parser nie mógł rozpoznać (nieznana funkcja „\strA”): {\displaystyle c^\strA=a_0, a_1, a_2,\ldots} , takich że Parser nie mógł rozpoznać (nieznana funkcja „\strA”): {\displaystyle (a_i,a_{i+1})\in P^\strA} dla każdego . \end{lemat} Dowód
Twierdzenie
Nie istnieje algorytm rozstrzygający czy dana formuła logiki pierwszego rzędu jest tautologią.
Dowód
\def\blank{\hbox{\sf Btworzy formułę Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi_\M} o takiej własności:
\hfil Parser nie mógł rozpoznać (nieznana funkcja „\M”): {\displaystyle \M} akceptuje słowo puste \quad \wtw, gdy\quad Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi_\M} jest tautologią.
Stąd natychmiast wynika teza twierdzenia. W przeciwnym razie taka konstrukcja pozwalałaby bowiem na rozstrzyganie problemu stopu.
W istocie, wygodniej będzie skonstruować taką formułę Parser nie mógł rozpoznać (nieznana funkcja „\M”): {\displaystyle \psi_\M} , że
\hfil Parser nie mógł rozpoznać (nieznana funkcja „\M”): {\displaystyle \M} zapętla się na słowie pustym \quad \wtw, gdy\quad Parser nie mógł rozpoznać (nieznana funkcja „\M”): {\displaystyle \psi_\M} jest spełnialna,
i na koniec przyjąć Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi_\M=\neg \psi_\M} . Sygnatura naszej formuły będzie zależała od maszyny Parser nie mógł rozpoznać (nieznana funkcja „\M”): {\displaystyle \M} (bo tak jest łatwiej) chociaż tak być nie musi (Ćwiczenie #stalasygnatura). Składa się ona z:
- jednoargumentowych symboli relacyjnych , dla wszystkich
stanów ;
- dwuargumentowych symboli relacyjnych ,
dla wszystkich symboli ;
- dwuargumentowego symbolu relacyjnego ;
- stałej i symboli i
występujących w formule z Lematu #nieKronecker.
Formuła Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi_\M}
jest koniunkcją złożoną z wielu składowych, które
teraz opiszemy. Pierwszą składową jest formuła
z Lematu #nieKronecker. Każdy model tej formuły zawiera
różnowartościowy ciąg , który posłuży nam
jako substytut ciągu liczb naturalnych (oelemencie myślimy
jak o liczbie ). Intuicyjny sens formuł atomowych naszej
sygnatury jest taki:
- Formułę czytamy: po krokach obliczenia
maszyna jest w stanie .
- Formułę czytamy: po krokach
głowica maszyny znajduje się w pozycji .
- Formułę czytamy: po krokach na pozycji
znajduje się symbol .
Dalsze składowe naszej formuły Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi_\M}
są tak dobrane, aby każdy
jej model reprezentował nieskończone obliczenie maszyny zaczynające
się od słowa pustego. \Leftrightarrow te składowe:
- Parser nie mógł rozpoznać (błąd składni): {\displaystyle S_{q_0}(c)\wedge G(c,c)\wedge \forall x\,C_{\sf B}(c,x)} ;
- ;
- , dla , ;
- ;
- , dla ,
;
- ;
- ;
- </math>\forall x\forall y\forall z(S_q(x)\wedge G(x,y)\wedge C_a(x,y)
\wedge P(x,z)\to S_p(z)\wedge C_b(z,y))</math>, gdy ;
- </math>\forall x\forall y\forall z(\neg G(x,y)\wedge C_a(x,y) \wedge P(x,z)
\to C_a(z,y))</math>;
- </math>\forall x\forall y\forall z\forall v(S_q(x)\wedge G(x,y)\wedge P(x,z)
\wedge P(y,v)\to G(z,v))</math>, gdy ;
- </math>\forall x\forall y\forall z(S_q(x)\wedge G(x,y)\wedge P(x,z)
\to G(z,y))</math>, gdy ;
- </math>\forall x\forall y\forall z\forall v(S_q(x)\wedge G(x,y)\wedge P(x,z)
\wedge P(v,y)\to G(z,v))</math>, gdy ;
- </math>\forall x\forall y\forall z\forall v(S_q(x)\wedge G(x,c)\wedge P(x,z)
\to G(z,c))</math>, gdy ;
- .
Przypuśćmy teraz, że maszyna Parser nie mógł rozpoznać (nieznana funkcja „\M”): {\displaystyle \M}
ma nieskończone obliczenie dla
pustego słowa wejściowego. Zbudujemy model Parser nie mógł rozpoznać (nieznana funkcja „\strA”): {\displaystyle \strA}
dla
formuły Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi_\M}
. Dziedziną tego modelu jest zbiór Parser nie mógł rozpoznać (nieznana funkcja „\NN”): {\displaystyle \NN}
liczb naturalnych. Stałą interpretujemy jako zero, relacja
Parser nie mógł rozpoznać (nieznana funkcja „\strA”): {\displaystyle P^\strA}
to relacja następnika, a Parser nie mógł rozpoznać (nieznana funkcja „\strA”): {\displaystyle R^\strA}
to (ostra) relacja mniejszości.
Relacje Parser nie mógł rozpoznać (nieznana funkcja „\A”): {\displaystyle S_q^\A}
, Parser nie mógł rozpoznać (nieznana funkcja „\A”): {\displaystyle C_a^\A}
i Parser nie mógł rozpoznać (nieznana funkcja „\A”): {\displaystyle G^\A}
określamy zgodnie z ich intuicyjną
interpretacją na podstawie przebiegu nieskończonego obliczenia maszyny.
Nietrudno się przekonać, że wszystkie człony koniunkcji są prawdziwe
w Parser nie mógł rozpoznać (nieznana funkcja „\strA”): {\displaystyle \strA}
, czyli zdanie Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi_\M}
jest spełnialne.
Przystąpmy więc do trudniejszej części dowodu. Załóżmy mianowicie, że Parser nie mógł rozpoznać (nieznana funkcja „\strA”): {\displaystyle \strA\models\var\varphi_\M} dla pewnej struktury Parser nie mógł rozpoznać (nieznana funkcja „\strA”): {\displaystyle \strA} . Wtedy także Parser nie mógł rozpoznać (nieznana funkcja „\strA”): {\displaystyle \strA\models\vartheta} , niech więc będąelementami Parser nie mógł rozpoznać (nieznana funkcja „\strA”): {\displaystyle \strA} , o których mowa w Lemacie #nieKronecker. Struktura Parser nie mógł rozpoznać (nieznana funkcja „\strA”): {\displaystyle \strA} spełnia też wszystkie pozostałe składowe formuły Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi_\M} . Składowe (2) i (3) gwarantują, że każdy zelementów należy do dokładnie jednej z relacji . Podobnie, każda para należy do dokładnie jednej z relacji , oraz każde jest w relacji z dokładnie jednymelementem struktury Parser nie mógł rozpoznać (nieznana funkcja „\strA”): {\displaystyle \strA} --- tu używamy składowych (4)--(7).
Rozpatrzmy obliczenie maszyny Parser nie mógł rozpoznać (nieznana funkcja „\M”): {\displaystyle \M} dla słowa pustego. Pokażemy, że jest to obliczenie nieskończone.
Jeśli obliczenie maszyny Parser nie mógł rozpoznać (nieznana funkcja „\M”): {\displaystyle \M} składa się z co najmniej kroków, to przez oznaczmy stan, w którym znajduje się maszyna Parser nie mógł rozpoznać (nieznana funkcja „\M”): {\displaystyle \M} po wykonaniu tych kroków, a przez pozycję głowicy w tym momencie. Zawartością -tej komórki taśmy po -tym kroku obliczenia niech zaś będzie symbol .
Przez indukcję \zwn dowodzimy, że dla dowolnego Parser nie mógł rozpoznać (nieznana funkcja „\NN”): {\displaystyle n\in\NN} obliczenie składa się z co najmniej kroków, oraz:
\hfil Parser nie mógł rozpoznać (nieznana funkcja „\strA”): {\displaystyle a_n\in S_{q_n}^\strA} \qquad Parser nie mógł rozpoznać (nieznana funkcja „\strA”): {\displaystyle (a_n,a_m)\in C_{b_{nm}}^\strA} \qquadParser nie mógł rozpoznać (nieznana funkcja „\strA”): {\displaystyle (a_n,a_{k_n})\in G^\strA} .
Inaczej mówiąc, model Parser nie mógł rozpoznać (nieznana funkcja „\strA”): {\displaystyle \strA} prawidłowo reprezentuje kolejne konfiguracje maszyny. Dla powyższe związki wynikają wprost z prawdziwości członu (1) naszej koniunkcji. W kroku indukcyjnym skorzystamy przede wszystkim z członu (14), który gwarantuje, że stan nie jest końcowy. Określona jest więc wartość funkcji przejścia . Możemy więc odwołać się do składowych (9--12), które zapewniają poprawną zmianę stanu i symbolu pod głowicą (8), zachowanie bez zmian reszty taśmy (9) i przesunięcie głowicy (10--12). Szczegóły dowodu pozostawiamy Czytelnikowi. }}
Twierdzenie #entscheidungsproblem można wzmocnić, pokazując (Ćwiczenie #stalasygnatura), że problem jest nierozstrzygalny nawet dla formuł nad pewną\boldsymbol{s}}\def\blank{\hbox{\sf Bstaloną sygnaturą. W istocie, jest tak dla większości sygnatur, z wyjątkiem bardzo ,,ubogich przypadków. Dwa takie przypadki są przedmiotem Ćwiczeń #rJ1 i #rJ2 do Rozdziału #trzynasty.
\subsection*{Ćwiczenia}\begin{small}
pokazać, że następujące formuły są tautologiami:
- </math>(\exists y p(y) \to \forall z q(z)) \to
\forall y\forall z(p(y)\to q(z))</math>; %95b
- </math>(\forall x\exists y r(x,y) \to \exists x\forall y r(y,x))\to
\exists x\forall y(r(x,y) \to r(y,x))</math>; %99a
- </math>\forall x\exists y((p(x)\to q(y))\to r(y))
\to ((\forall x p(x)\to \forall y q(y))\to \exists y r(y))</math>; %109a
- </math>\forall x(p(x)\to \exists y q(y))\to
\exists y(\exists x p(x)\to q(y))</math>.% 110a
\item Jak rozumiesz następujące zdania? Jak je sformułować, żeby nie
budziły wątpliwości?
- Nie wolno pić i grać w karty.
- Nie wolno pluć i łapać.
- Zabrania się zaśmiecania i zanieczyszczania drogi.\footnote{Kodeks
Drogowy przed nowelizacją w roku 1997.}
- {\it Zabrania się zaśmiecania lub zanieczyszczania
drogi.}\footnote{Kodeks Drogowy po nowelizacji w roku 1997.}
- {\it Wpisać, gdy osoba\boldsymbol{s}}\def\blank{\hbox{\sf Bbezpieczona nie posiada numerów identyfikacyjnych
NIP lub \mbox{PESEL}.}\footnote{Instrukcja wypełniania formularza ZUS ZCZA (Zgłoszenie danych o członkach rodziny\dots)}
- {\it Podaj przykład liczby, która jest pierwiastkiem pewnego
równania kwadratowego o współczynnikach całkowitych i takiej, która nie jest.}
- Warunek zachodzi dla każdego i dla pewnego .\/
\item Czy następujące definicje można lepiej sformułować?
- Zbiór jest {\sf dobry}, jeśli ma co najmniej 2elementy.
- Zbiór jest {\sf dobry, jeśli dla każdego ,
jeśli jest parzyste, to jest podzielne przez .}
- Zbiór jest {\sf dobry, jeśli dla pewnego ,
jeśli jest parzyste, to jest podzielne przez .}
\item Wskazać błąd w rozumowaniu:
- {\it Aby wykazać prawdziwość tezy\\
{\sf ,,Dla dowolnego , jeśli zachodzi warunek to zachodzi warunek }\\ załóżmy, że dla dowolnego zachodzi \dots}
- {\it Aby wykazać prawdziwość tezy\\
{\sf ,,Dla pewnego , jeśli zachodzi warunek to zachodzi warunek }\\ załóżmy, że dla pewnego zachodzi \dots}
\item Sformułować poprawnie zaprzeczenia stwierdzeń:
- Liczby i są pierwsze.
- Liczby i są względnie pierwsze.
\item Czy zdanie {\it ,,Liczba nie jest kwadratem pewnej liczby
całkowitej\/}
jest poprawnym zaprzeczeniem zdania {\it ,,Liczba jest kwadratem
pewnej liczby całkowitej\/}?
\item Sygnatura składa się z symboli , i . Napisać takie zdania Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi} i , że:%61 jest rozwiazanie
- zdanie Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi} jest prawdziwe dokładnie w tych modelach
Parser nie mógł rozpoznać (nieznana funkcja „\A”): {\displaystyle \A = \<A, R^\A, S^\A, r^\A, s^\A, g^\A\>} , w których obie relacje Parser nie mógł rozpoznać (nieznana funkcja „\A”): {\displaystyle R^\A} , Parser nie mógł rozpoznać (nieznana funkcja „\A”): {\displaystyle S^\A} są przechodnie, ale ich suma nie jest przechodnia;
- zdanie jest prawdziwe dokładnie w tych modelach
Parser nie mógł rozpoznać (nieznana funkcja „\A”): {\displaystyle \A = \<A, R^\A, S^\A, r^\A, s^\A, g^\A\>} , w których Parser nie mógł rozpoznać (nieznana funkcja „\A”): {\displaystyle s^\A} jest obrazem iloczynu kartezjańskiego Parser nie mógł rozpoznać (nieznana funkcja „\A”): {\displaystyle r^\A\times r^\A} przy funkcji Parser nie mógł rozpoznać (nieznana funkcja „\A”): {\displaystyle g^\A} .
\item Sygnatura składa się z dwuargumentowych symboli
relacyjnych i oraz dwuargumentowego symbolu funkcyjnego .
Napisać (możliwie najkrótsze) zdanie, które jest prawdziwe dok{ł}adnie
w tych modelach%77 jest rozwiazanie
Parser nie mógł rozpoznać (nieznana funkcja „\A”): {\displaystyle \A = \<A, r^{\A}, s^{\A}, f^{\A}\>}
, w których:
- Złożenie relacji Parser nie mógł rozpoznać (nieznana funkcja „\A”): {\displaystyle r^{\A}} i Parser nie mógł rozpoznać (nieznana funkcja „\A”): {\displaystyle s^{\A}} zawiera się w ich iloczynie
Parser nie mógł rozpoznać (nieznana funkcja „\A”): {\displaystyle r^\A\cap s^\A} ;
- Zbiór wartości funkcji Parser nie mógł rozpoznać (nieznana funkcja „\A”): {\displaystyle f^{\A}} jest rzutem sumy Parser nie mógł rozpoznać (nieznana funkcja „\A”): {\displaystyle r^\A\cup s^\A} na
pierwszą współrzędną;
- Relacja Parser nie mógł rozpoznać (nieznana funkcja „\A”): {\displaystyle r^\A} nie jest funkcją z w ;
- Obraz Parser nie mógł rozpoznać (nieznana funkcja „\A”): {\displaystyle r^\A} przy funkcji Parser nie mógł rozpoznać (nieznana funkcja „\A”): {\displaystyle f^\A} jest podstrukturą w Parser nie mógł rozpoznać (nieznana funkcja „\A”): {\displaystyle \A} ;
- Obraz zbioru przy funkcji Parser nie mógł rozpoznać (nieznana funkcja „\A”): {\displaystyle f^\A} jest pusty.
\item
Dla każdej z par struktur:
- Parser nie mógł rozpoznać (błąd składni): {\displaystyle \<\NN,\leq\>} i Parser nie mógł rozpoznać (błąd składni): {\displaystyle \<\{m-{1\over n}\ |\ m,n\in\NN-\{0\}\}, \leq\>} ;
- Parser nie mógł rozpoznać (błąd składni): {\displaystyle \<\NN, +\>} i Parser nie mógł rozpoznać (błąd składni): {\displaystyle \<\ZZ, +\>} ;
- Parser nie mógł rozpoznać (błąd składni): {\displaystyle \<\NN, \leq\>} i Parser nie mógł rozpoznać (błąd składni): {\displaystyle \<\ZZ, \leq\>} ,
wskaż zdanie prawdziwe w jednej z nich a w drugiej nie.
\item Napisać takie zdania Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi} i , że:
- zdanie Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi} jest prawdziwe w modelu Parser nie mógł rozpoznać (nieznana funkcja „\A”): {\displaystyle \A = \<\ZZ, +, 0 \>} ,
ale nie w modelu Parser nie mógł rozpoznać (nieznana funkcja „\B”): {\displaystyle \B = \<\NN, +, 0 \>} ;
- zdanie jest prawdziwe w modelu Parser nie mógł rozpoznać (nieznana funkcja „\B”): {\displaystyle \B = \<\ZZ, +, 0 \>} ,
ale nie w modelu Parser nie mógł rozpoznać (błąd składni): {\displaystyle \C = \<\QQ, +, 0 \>} .
\item Wskazać formułę pierwszego rzędu:
- spełnialną w
ciele liczb rzeczywistych ale nie w ciele liczb wymiernych;
- spełnialną w algebrze Parser nie mógł rozpoznać (nieznana funkcja „\NN”): {\displaystyle \NN} z mnożeniem,
ale nie w algebrze Parser nie mógł rozpoznać (nieznana funkcja „\NN”): {\displaystyle \NN} z dodawaniem;
- spełnialną w Parser nie mógł rozpoznać (błąd składni): {\displaystyle \<\{a,b\}^*,\cdot,\varepsilon\>}
ale nie w Parser nie mógł rozpoznać (błąd składni): {\displaystyle \<\{a,b,c\}^*,\cdot,\varepsilon\>} .
\item Zmodyfikować konstrukcję
z dowodu Twierdzenia #entscheidungsproblem w ten sposób,
aby w formule Parser nie mógł rozpoznać (nieznana funkcja „\M”): {\displaystyle \psi_\M}
nie występował symbol równości
ani stała </math>cParser nie mógł rozpoznać (błąd składni): {\displaystyle . %%{1. Napisać }
\forall x\forall y\forall z(G(x,y)\wedge
\item Zmodyfikować konstrukcję
z dowodu Twierdzenia #entscheidungsproblem w ten sposób,
aby Parser nie mógł rozpoznać (nieznana funkcja „\M”): {\displaystyle \psi_\M}
była zawsze formułą\boldsymbol{s}}\def\blank{\hbox{\sf Bstalonej sygnatury (niezależnej
od maszyny Parser nie mógł rozpoznać (nieznana funkcja „\M”): {\displaystyle \M}
). Wywnioskować stąd, że logika pierwszego rzędu
nad tą\boldsymbol{s}}\def\blank{\hbox{\sf Bstaloną sygnaturą jest nierozstrzygalna.
\end{small}