Logika dla informatyków/Logika pierwszego rzędu. Sposób użycia: Różnice pomiędzy wersjami
m Zastępowanie tekstu – „<math> ” na „<math>” |
|||
(Nie pokazano 29 wersji utworzonych przez 5 użytkowników) | |||
Linia 5: | Linia 5: | ||
Przyjrzyjmy się teraz kilku ważnym tautologiom. | Przyjrzyjmy się teraz kilku ważnym tautologiom. | ||
{{fakt||trkd| | {{fakt|3.1|trkd| | ||
Następujące formuły są tautologiami (dla dowolnych <math>\var\varphi</math> i <math>\psi</math>). | Następujące formuły są tautologiami (dla dowolnych <math>\var\varphi</math> i <math>\psi</math>). | ||
#<math>\forall x(\var\varphi\to\psi)\to(\exists x\var\varphi\to\exists x\psi)</math>; | #<math>\forall x(\var\varphi\to\psi)\to(\exists x\var\varphi\to\exists x\psi)</math>; | ||
#<math>\exists x\varphi \to \varphi </math>, o ile <math> x \not\in FV(\varphi)</math>; | #<math>\exists x\varphi \to \varphi</math>, o ile <math>x \not\in FV(\varphi)</math>; | ||
#<math> \varphi | #<math>\varphi(s/x) \to \exists x\varphi</math>; | ||
#<math>\neg\forall x\varphi \leftrightarrow \exists x\neg\varphi</math>; | #<math>\neg\forall x\varphi \leftrightarrow \exists x\neg\varphi</math>; | ||
#<math>\neg\exists x\varphi \leftrightarrow \forall x\neg\varphi</math>; | #<math>\neg\exists x\varphi \leftrightarrow \forall x\neg\varphi</math>; | ||
#<math>\forall x(\varphi\wedge\psi)\leftrightarrow \forall x\varphi\wedge\forall x\psi</math>; | #<math>\forall x(\varphi\wedge\psi)\leftrightarrow \forall x\varphi\wedge\forall x\psi</math>; | ||
#<math>\exists x(\varphi\vee\psi)\leftrightarrow\exists x\varphi\vee\exists x\psi</math>; | #<math>\exists x(\varphi\vee\psi)\leftrightarrow\exists x\varphi\vee\exists x\psi</math>; | ||
#<math>\forall x(\varphi\vee\psi)\leftrightarrow \varphi\vee\forall x\psi</math>,o ile <math>x\not\in FV(\varphi)</math>; | #<math>\forall x(\varphi\vee\psi)\leftrightarrow \varphi\vee\forall x\psi</math>, o ile <math>x\not\in FV(\varphi)</math>; | ||
#<math>\exists x(\varphi\wedge\psi)\leftrightarrow\varphi\wedge\exists x\psi</math>, o ile <math>x\not\in FV(\varphi)</math>; | #<math>\exists x(\varphi\wedge\psi)\leftrightarrow\varphi\wedge\exists x\psi</math>, o ile <math>x\not\in FV(\varphi)</math>; | ||
#<math>\forall x\varphi\to\exists x\varphi</math>; | #<math>\forall x\varphi\to\exists x\varphi</math>; | ||
Linia 53: | Linia 53: | ||
tautologią. | tautologią. | ||
Stosując równoważności (4-- | Stosując równoważności (4--9) możemy każdą formułę | ||
sprowadzić do postaci, w której wszystkie kwantyfikatory znajdują się | sprowadzić do postaci, w której wszystkie kwantyfikatory znajdują się | ||
na początku. | na początku. | ||
Linia 95: | Linia 95: | ||
}} | }} | ||
{{kotwica|rozdz3.1|}} | |||
===Logika formalna i język polski=== | ===Logika formalna i język polski=== | ||
Systemy logiki formalnej są, jak już mówiliśmy, tylko pewnymi modelami, | Systemy logiki formalnej są, jak już mówiliśmy, tylko pewnymi modelami, | ||
Linia 110: | Linia 110: | ||
do analizy np. takiego rozumowania: | do analizy np. takiego rozumowania: | ||
<center>''Każdy cyrulik sewilski goli tych wszystkich mężczyzn w Sewilli, którzy się | <center>''Każdy cyrulik sewilski goli tych wszystkich mężczyzn w Sewilli, którzy się sami nie golą.'' | ||
''Ale nie goli żadnego z tych, którzy golą się sami.'' | ''Ale nie goli żadnego z tych, którzy golą się sami.'' | ||
Linia 128: | Linia 128: | ||
być może jest kobietą. | być może jest kobietą. | ||
W powyższym przykładzie po prostu źle\boldsymbol{s}}\def\blank{\hbox{ | W powyższym przykładzie po prostu źle\boldsymbol{s}}\def\blank{\hbox\mathsf{ B ustalono logiczną interpretację | ||
naszego zadania, zapominając o jednym z jego | naszego zadania, zapominając o jednym z jego istotnych elementów. | ||
Błąd ten można łatwo naprawić, co jest zalecane jako ćwiczenie. Ale | 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\ | nie zawsze język logiki formalnej wyraża ściśle to samo, co p\leftrightarrow potoczny | ||
język polski, a nawet język w którym pisane są prace matematyczne. | 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 | Zarówno składnia jak i semantyka tych języków rządzi się zupełnie innymi | ||
Linia 139: | Linia 139: | ||
====Implikacja materialna i związek przyczynowo-skutkowy==== | ====Implikacja materialna i związek przyczynowo-skutkowy==== | ||
Implikacja, o której mówimy w logice klasycznej | Implikacja, o której mówimy w logice klasycznej, | ||
to tzw. ''implikacja materialna''. Wartość logiczna, którą przypisujemy | to tzw. ''implikacja materialna''. Wartość logiczna, którą przypisujemy | ||
wyrażeniu <math>\var\varphi \to\psi</math> zależy wyłącznie od wartości logicznych | wyrażeniu <math>\var\varphi \to\psi</math> zależy wyłącznie od wartości logicznych | ||
Linia 148: | Linia 148: | ||
o zajściu jakichś zdarzeń i wtedy wartość logiczna implikacji | o zajściu jakichś zdarzeń i wtedy wartość logiczna implikacji | ||
<math>\var\varphi\to\psi</math> | <math>\var\varphi\to\psi</math> | ||
nie ma nic wspólnego z | nie ma nic wspólnego z ich ewentualnym następstwem w czasie, lub też | ||
z tym, że jedno z tych zdarzeń spowodowało drugie. W języku polskim | z tym, że jedno z tych zdarzeń spowodowało drugie. W języku polskim | ||
stwierdzenie "jeśli <math>\var\varphi</math> to <math>\psi</math>" oczywiście sugeruje | stwierdzenie "jeśli <math>\var\varphi</math> to <math>\psi</math>" oczywiście sugeruje | ||
Linia 159: | Linia 159: | ||
prawdą jest stwierdzenie odwrotne: | prawdą jest stwierdzenie odwrotne: | ||
<center>''Jeśli terminal działa to zasilanie jest włączone.'' </center> | <center>''Jeśli terminal działa, to zasilanie jest włączone.'' </center> | ||
Natomiast zdanie | Natomiast zdanie | ||
Linia 174: | Linia 174: | ||
"''A, chyba że B''" ma inny odcień znaczeniowy niż proste | "''A, chyba że B''" ma inny odcień znaczeniowy niż proste | ||
"''A lub B''". Przy tej okazji zwróćmy uwagę na to, że słowo | "''A lub B''". Przy tej okazji zwróćmy uwagę na to, że słowo | ||
"''albo''" bywa czasem rozumiane w znaczeniu alternatywy | "''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ę: | |||
<center> ''Każdy kot ma wąsy.'' <br>''Pewien kot ma wąsy.''</center> | |||
Ale ich tłumaczenia na język rachunku predykatów nie są już takie podobne: | |||
<center> <math>\forall x(Kot(x) \to</math>''MaWąsy''<math>(x))</math>; | |||
<math>\exists x(Kot(x) \wedge</math>''MaWąsy''<math>(x))</math>. | |||
</center> | |||
Dość częstym błędem jest właśnie mylenie koniunkcji z implikacją | |||
w zasięgu działania kwantyfikatora. A oto inny przykład: Zdania | |||
<center>''Liczba <math>n</math> jest parzysta;'' | |||
''Liczba <math>n</math> jest dwukrotnością pewnej liczby'' </center> | |||
oznaczają to samo. Zaprzeczeniem pierwszego z nich jest oczywiście | |||
zdanie | |||
<center> ''Liczba <math>n</math> nie jest parzysta'', </center> | |||
ale zaprzeczeniem drugiego nie jest zdanie | |||
<center> ''Liczba <math>n</math> nie jest dwukrotnością pewnej liczby,'' </center> | |||
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 | |||
implikacji, 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 | |||
<center> ''Kto nie ma biletu lub nie jest pracownikiem teatru, ten nie wejdzie na przedstawienie.''</center> | |||
Ale od tekstu matematycznego oczekujemy więcej ścisłości i w takim tekście | |||
zdanie: | |||
<center> ''Jeśli ''<math>x</math> ''nie jest równe ''<math>2</math> ''lub nie jest równe 3 | |||
to ''<math>x^2-5x+6</math>'' nie jest zerem''.</center> | |||
może wprowadzić czytelnika w błąd. ""Dosłowne" tłumaczenie tego zdania na język logiki predykatów, to przecież formuła | |||
<center><math>\neg(x=2)\vee \neg(x=3) \to \neg(x^2-5x+6 = 0)</math>,</center> | |||
a nie formuła | |||
<center> <math>\neg(x=2\vee x=3)\to \neg(x^2-5x+6 = 0)</math>.</center> | |||
Wielu takich dwuznaczności unikniemy, gdy przypomnimy sobie, że w języku polskim istnieją takie słowa jak | |||
''ani'' i ''żaden''. | |||
===Siła wyrazu logiki pierwszego rzędu === | |||
Język logiki pierwszego rzędu, dzięki możliwości uż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|3.5|drzwizamknela| | |||
Przypuśćmy, że sygnatura składa się z dwóch jednoargumentowych symboli | |||
relacyjnych <math>R</math> i <math>S</math>, | |||
i dwuargumentowego symbolu funkcyjnego <math>f</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, 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 <math>R^A\cap S^A</math> | |||
}} | |||
{{przyklad|3.6|malpa| | |||
Teraz niech nasza sygnatura składa się z jednej operacji dwuargumentowej | |||
<math>\cdot</math> i z jednej stałej <math>\varepsilon</math>. Zdanie | |||
<center><math>\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. | |||
}} | |||
===Nierozstrzygalność === | |||
Niestety, konsekwencją znacznej siły wyrazu logiki pierwszego rzędu jest | |||
jej nierozstrzygalność. Dokładniej, nierozstrzygalny jest następujący | |||
problem decyzyjny:<ref name="siedem">W istocie, nazwa 'problem decyzyjny" (Entscheidungsproblem) została użyta po raz pierwszy właśnie w tym | |||
kontekście.</ref>''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>B \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 utoż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ą''. | |||
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>\Rightarrow_M</math> oznaczamy przechodnio-zwrotne domknięcie relacji <math>\to_M</math>. Jeżeli <math>C_w\Rightarrow_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. | |||
{{lemat|3.7|nieKronecker| | |||
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>\mathfrak A</math> | |||
zawiera nieskończony ciąg różnych elementów <math>c^\mathfrak A=a_0, a_1, a_2,\ldots</math>, | |||
takich że <math>(a_i,a_{i+1})\in P^\mathfrak A</math> dla każdego <math>i</math>. | |||
}} | |||
{{dowod||| | |||
Ćwiczenie. | |||
}} | |||
{{twierdzenie|3.8|entscheidungsproblem| | |||
Nie istnieje algorytm rozstrzygający, czy dana formuła logiki pierwszego rzędu | |||
jest tautologią. | |||
}} | |||
{{dowod||| | |||
Naszym celem jest efektywna konstrukcja, która dla dowolnej maszyny Turinga <math>M</math> utworzy formułę <math>\var\varphi_\M</math> o takiej własności: | |||
<center><math>M</math>''akceptuje słowo puste'' wtedy i tylko wtedy, gdy <math>\var\varphi_M</math> ''jest tautologią''.</center> | |||
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 | |||
<center><math>M</math> ''zapętla się na słowie pustym'' wtedy i tylko wtedy, gdy <math>\psi_M</math> ''jest spełnialna'',</center> | |||
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 ([[Logika dla informatyków/Ćwiczenia 3#stalasygnatura|Ćwiczenie 13]]). 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 [[#nieKronecker|Lematu 3.7]]. | |||
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 [[#nieKronecker|Lematu 3.7]]. 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 (o elemencie <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. Oto te składowe: | |||
#<math>S_{q_0}(c)\wedge G(c,c)\wedge \forall x\,C_\mathsf{ 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>\mathfrak A</math> dla | |||
formuły <math>\var\varphi_M</math>. Dziedziną tego modelu jest zbiór <math>\mathbb N</math> | |||
liczb naturalnych. Stałą <math>c</math> interpretujemy jako zero, relacja | |||
<math>P^\mathfrak A</math> to relacja następnika, a <math>R^\mathfrak A</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>\mathfrak A</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>\mathfrak A\models\var\varphi_M</math> dla pewnej struktury <math>\mathfrak A</math>. Wtedy także | |||
<math>\mathfrak A\models\vartheta</math>, niech więc | |||
<math>a_i</math> będą elementami <math>\mathfrak A</math>, o których mowa w [[#nieKronecker|Lemacie 3.7]]. | |||
Struktura <math>\mathfrak A</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 z elementó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 jednym elementem struktury <math>\mathfrak A</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ę ze względu na <math>n</math> dowodzimy, że dla dowolnego <math>n\in\mathbb N</math> | |||
obliczenie składa się z co najmniej <math>n</math> kroków, oraz: | |||
<center><math>a_n\in S_{q_n}^\mathfrak A</math> <math>(a_n,a_m)\in C_{b_{nm}}^\mathfrak A</math><math>(a_n,a_{k_n})\in G^\mathfrak A</math>.</center> | |||
Inaczej mówiąc, model <math>\mathfrak A</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. | |||
}} | |||
[[#entscheidungsproblem|Twierdzenie 3.8]] można wzmocnić, pokazując ([[Logika dla informatyków/Ćwiczenia 3#stalasygnatura|Ćwiczenie 13]]), że problem jest nierozstrzygalny | |||
nawet dla formuł nad pewną ustaloną sygnaturą. W istocie, jest tak dla większości sygnatur, z wyjątkiem bardzo "ubogich" przypadków. | |||
Dwa takie przypadki są przedmiotem Ćwiczeń [[Logika dla informatyków/Ćwiczenia 13#rJ1|2]] i [[Logika dla informatyków/Ćwiczenia 13#rJ2|5]] do [[Logika dla informatyków/Logika w informatyce]]. | |||
===Przypisy=== | |||
<references/> |
Aktualna wersja na dzień 10:36, 5 wrz 2023
Logika pierwszego rzędu. Sposób użycia.
Przyjrzyjmy się teraz kilku ważnym tautologiom.
Fakt 3.1
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\mathsf{ B ustalono logiczną interpretację naszego zadania, zapominając o jednym z jego istotnych elementó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\leftrightarrow potoczny 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 ich ewentualnym 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ę:
Pewien kot ma wąsy.
Ale ich tłumaczenia na język rachunku predykatów nie są już takie podobne:
MaWąsy.
Dość częstym błędem jest właśnie mylenie koniunkcji z implikacją w zasięgu działania kwantyfikatora. A oto inny przykład: Zdania
oznaczają to samo. Zaprzeczeniem pierwszego z nich jest oczywiście zdanie
ale zaprzeczeniem drugiego nie jest zdanie
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 implikacji, 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
Ale od tekstu matematycznego oczekujemy więcej ścisłości i w takim tekście zdanie:
może wprowadzić czytelnika w błąd. ""Dosłowne" tłumaczenie tego zdania na język logiki predykatów, to przecież formuła
a nie formuła
Wielu takich dwuznaczności unikniemy, gdy przypomnimy sobie, że w języku polskim istnieją takie słowa jak ani i żaden.
Siła wyrazu logiki pierwszego rzędu
Język logiki pierwszego rzędu, dzięki możliwości uż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 3.5
Przypuśćmy, że sygnatura składa się z dwóch jednoargumentowych symboli relacyjnych i , i dwuargumentowego symbolu funkcyjnego . Wtedy formuła
jest prawdziwa dokładnie w tych modelach , w których obraz iloczynu kartezjańskiego przy przekształceniu zawiera się w zwykłym iloczynie
Przykład 3.6
Teraz niech nasza sygnatura składa się z jednej operacji dwuargumentowej i z jednej stałej . Zdanie
jest prawdziwe w strukturze słów nad alfabetem z konkatenacją i słowem pustym, ale nie w modelu słów nad alfabetem trzyliterowym . Inaczej mówiąc, nasze zdanie rozróżnia te dwie struktury.
Nierozstrzygalność
Niestety, konsekwencją znacznej siły wyrazu logiki pierwszego rzędu jest jej nierozstrzygalność. Dokładniej, nierozstrzygalny jest następujący problem decyzyjny:<ref name="siedem">W istocie, nazwa 'problem decyzyjny" (Entscheidungsproblem) została użyta po raz pierwszy właśnie w tym kontekście.</ref>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 można zdefiniować jako krotkę , gdzie:
- jest skończonym alfabetem, zawierającym oraz symbol (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 utoż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 , nazywamy początkową, a konfigurację postaci nazywamy końcową lub akceptującą.
Relację na konfiguracjach definiuje się tak:
- Jeśli , to ;
- Jeśli , to ;
- Jeśli , to oraz (gdy ruch w lewo jest niemożliwy.)
Symbolem oznaczamy przechodnio-zwrotne domknięcie relacji . Jeżeli , 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.
Lemat 3.7
Niech oznacza koniunkcję następujących formuł
Zdanie jest spełnialne, a każdy jego model zawiera nieskończony ciąg różnych elementów , takich że dla każdego .
Dowód
Twierdzenie 3.8
Nie istnieje algorytm rozstrzygający, czy dana formuła logiki pierwszego rzędu jest tautologią.
Dowód
Naszym celem jest efektywna konstrukcja, która dla dowolnej maszyny Turinga utworzy formułę Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi_\M} o takiej własności:
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łę , że
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 (bo tak jest łatwiej) chociaż tak być nie musi (Ćwiczenie 13). 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 3.7.
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 3.7. Każdy model tej formuły zawiera
różnowartościowy ciąg , który posłuży nam
jako substytut ciągu liczb naturalnych (o elemencie 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. Oto te składowe:
- ;
- ;
- , dla , ;
- ;
- , dla ,;
- ;
- ;
- , gdy ;
- ;
- , gdy ;
- , gdy ;
- , gdy ;
- , gdy ;
- .
Przypuśćmy teraz, że maszyna ma nieskończone obliczenie dla pustego słowa wejściowego. Zbudujemy model dla formuły Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi_M} . Dziedziną tego modelu jest zbiór liczb naturalnych. Stałą interpretujemy jako zero, relacja to relacja następnika, a to (ostra) relacja mniejszości. Relacje , i 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 , 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 „\var”): {\displaystyle \mathfrak A\models\var\varphi_M} dla pewnej struktury . Wtedy także , niech więc będą elementami , o których mowa w Lemacie 3.7. Struktura 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 z elementó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 jednym elementem struktury --- tu używamy składowych (4)--(7).
Rozpatrzmy obliczenie maszyny dla słowa pustego. Pokażemy, że jest to obliczenie nieskończone.
Jeśli obliczenie maszyny składa się z co najmniej kroków, to przez oznaczmy stan, w którym znajduje się maszyna 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ę ze względu na dowodzimy, że dla dowolnego obliczenie składa się z co najmniej kroków, oraz:
Inaczej mówiąc, model 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 3.8 można wzmocnić, pokazując (Ćwiczenie 13), że problem jest nierozstrzygalny nawet dla formuł nad pewną ustaloną sygnaturą. W istocie, jest tak dla większości sygnatur, z wyjątkiem bardzo "ubogich" przypadków. Dwa takie przypadki są przedmiotem Ćwiczeń 2 i 5 do Logika dla informatyków/Logika w informatyce.
Przypisy
<references/>