Logika dla informatyków/Język logiki pierwszego rzędu: Różnice pomiędzy wersjami
m Zastępowanie tekstu – „<math> ” na „<math>” |
|||
(Nie pokazano 38 wersji utworzonych przez 4 użytkowników) | |||
Linia 4: | Linia 4: | ||
Język logiki pierwszego rzędu <ref name="dwa">Logika pierwszego rzędu | Język logiki pierwszego rzędu <ref name="dwa">Logika pierwszego rzędu nazywana jest też ''rachunkiem predykatów'' lub ''rachunkiem kwantyfikatorów.''</ref> | ||
nazywana jest też ''rachunkiem | |||
predykatów'' lub ''rachunkiem kwantyfikatorów.''</ref> | |||
można traktować jak rozszerzenie rachunku zdań, | można traktować jak rozszerzenie rachunku zdań, | ||
pozwalające formułować stwierdzenia o zależnościach pomiędzy obiektami | |||
indywiduowymi | indywiduowymi (np. relacjach i funkcjach). | ||
Dzięki zastosowaniu | Dzięki zastosowaniu ''kwantyfikatorów'', odwołujących się | ||
do całej | do całej zbiorowości rozważanych obiektów, | ||
można w logice pierwszego rzędu | można w logice pierwszego rzędu | ||
wyrażać | wyrażać własności struktur relacyjnych oraz modelować | ||
rozumowania | rozumowania dotyczące takich struktur. | ||
Do zestawu symboli rachunku zdań dodajemy | Do zestawu symboli rachunku zdań dodajemy następujące | ||
nowe składniki syntaktyczne: | nowe składniki syntaktyczne: | ||
* | *''Symbole operacji i relacji'' (w tym symbol równości <math>=</math>); | ||
* | *''Zmienne indywiduowe'', których wartości mają przebiegać rozważane dziedziny; | ||
dziedziny; | *''Kwantyfikatory'', wiążące zmienne indywiduowe w formułach. | ||
* | |||
===Składnia=== | ===Składnia=== | ||
Symbole operacji i relacji | Symbole operacji i relacji są podstawowymi składnikami do budowy najprostszych formuł, tzw. formuł atomowych. Z tego względu w języku pierwszego | ||
formuł, tzw. | |||
rzędu rezygnuje się ze zmiennych zdaniowych. | rzędu rezygnuje się ze zmiennych zdaniowych. | ||
{{definicja||| | {{definicja|2.1|| | ||
Przez ''sygnaturę | Przez ''sygnaturę'' <math>\Sigma</math> rozumieć będziemy rodzinę zbiorów <math>\Sigma^F_n</math>, dla <math>n\geq0</math> | ||
będziemy rodzinę zbiorów <math>\Sigma^F_n</math>, dla <math>n\geq0</math> | oraz rodzinę zbiorów <math>\Sigma^R_n</math>, dla <math>n\geq 1</math>. Elementy <math>\Sigma^F_n</math> będziemy nazywać ''symbolami operacji'' | ||
oraz rodzinę zbiorów <math>\Sigma^R_n</math>, dla <math>n\geq 1</math>. Elementy | <math>n</math>-''argumentowych'', a elementy <math>\Sigma^R_n</math> będziemy nazywać | ||
<math>\Sigma^F_n</math> będziemy nazywać | ''symbolami relacji <math>n</math>-argumentowych''. Przyjmujemy, że wszystkie te | ||
<math>n</math>- | zbiory są parami rozłączne. | ||
symbolami relacji <math>n</math>-argumentowych | Umawiamy się też, że znak równości <math>=</math> nie należy do <math>\Sigma</math>. Symbol ten | ||
zbiory | |||
Umawiamy się też, że znak | |||
nie jest zwykłym symbolem relacyjnym, ale jest traktowany na | nie jest zwykłym symbolem relacyjnym, ale jest traktowany na | ||
specjalnych prawach. | specjalnych prawach. | ||
W praktyce, sygnatura zwykle jest skończona | W praktyce, sygnatura zwykle jest skończona | ||
i zapisuje się | i zapisuje się ją jako ciąg symboli. Np. ciąg złożony ze znaków | ||
<math>+,\cdot,0,1</math> | <math>+,\cdot,0,1</math> (o znanej każdemu | ||
liczbie argumentów | liczbie argumentów) tworzy sygnaturę języka teorii ciał. | ||
}} | }} | ||
{{definicja||| | {{definicja|2.2|| | ||
Ustalamy pewien nieskończony przeliczalny zbiór <math> | Ustalamy pewien nieskończony przeliczalny zbiór <math>X</math> symboli, które będziemy | ||
nazywać | nazywać ''zmiennymi indywiduowymi'' i zwykle oznaczać symbolami <math>x, y, z</math>. | ||
Zbiór | Zbiór ''termów'' <math>T_\Sigma(X)</math> nad sygnaturą <math>\Sigma</math> i zbiorem zmiennych <math>X</math> | ||
definiujemy indukcyjnie: | definiujemy indukcyjnie: | ||
*Zmienne indywiduowe | *Zmienne indywiduowe są termami. | ||
*Dla każdego <math>n\geq 0</math> i każdego symbolu operacji <math>f\in\Sigma^F_n</math>, | *Dla każdego <math>n\geq 0</math> i każdego symbolu operacji <math>f\in\Sigma^F_n</math>, jeśli <math>t_1,\ldots,t_n</math> są termami, to <math>f(t_1,\ldots,t_n)</math> jest też termem. | ||
<math>t_1,\ldots,t_n</math> | |||
}} | }} | ||
Zauważmy, że z powyższej definicji wynika, iż stałe sygnatury <math>\Sigma</math> (czyli symbole operacji zeroargumentowych) są termami. | |||
Dla każdego termu <math>t\in\ | {{definicja|2.3|| | ||
'' | |||
w <math>t</math>. Definicja jest indukcyjna: | Dla każdego termu <math>t\in T_\Sigma(X)</math> definiujemy zbiór <math>\fv t</math> zmiennych | ||
*<math> | ''występujących'' w <math>t</math>. Definicja jest indukcyjna: | ||
*<math> | *<math>FV(x)=\{x\}</math>. | ||
*<math>FV(f(t_1,\ldots, t_n))=\bigcup_{i=1}^n \fv{t_i}</math>. | |||
}} | }} | ||
{{definicja||| | {{definicja|2.4|| | ||
Następnie zdefiniujemy | Następnie zdefiniujemy ''formuły atomowe'' języka pierwszego rzędu. | ||
*Symbol fałszu <math>\bot</math> jest | *Symbol fałszu <math>\bot</math> jest formułą atomową. | ||
*Dla każdego <math>n\geq 1</math>, każdego symbolu <math>r\in\Sigma^R_n</math> relacji <math>n</math>-argumentowej oraz dla dowolnych termów <math>t_1,\ldots,t_n\in T_\Sigma(X)</math>, napis <math>r(t_1,\ldots,t_n)</math> jest formułą atomową. | |||
*Dla każdego <math>n\geq 1</math>, każdego symbolu <math>r\in\Sigma^R_n</math> relacji | *Dla dowolnych termów <math>t_1, t_2</math>, napis <math>(t_1=t_2)</math> jest formułą atomową. | ||
<math>n</math>-argumentowej | |||
<math>r | |||
*Dla dowolnych termów <math>t_1, t_2</math>, napis <math> | |||
}} | }} | ||
'''Konwencja:''' Niektóre dwuargumentowe symbole relacyjne | '''Konwencja:''' Niektóre dwuargumentowe symbole relacyjne (np. <math>\leq</math>) | ||
i funkcyjne | i funkcyjne (np. <math>+,\cdot</math> ) są zwyczajowo pisane pomiędzy argumentami. | ||
Na przykład formułę | Na przykład formułę atomową <math>{\leq}(x,y)</math> zwykle piszemy jako "<math>x\leq y</math>". | ||
{{definicja||def-form| | {{definicja|2.5|def-form| | ||
''Formuły'' nad sygnaturą <math>\Sigma</math> i zbiorem zmiennych indywiduowych <math>X</math> definiujemy indukcyjnie. | |||
<math> | *Każda formuła atomowa jest formułą. | ||
*Każda formuła atomowa jest | *Jeśli <math>\var\varphi,\psi</math> są formułami, to <math>(\var\varphi\to\psi)</math> jest też formułą. | ||
* | *Jeśli <math>\var\varphi</math> jest formułą, a <math>x\in X</math> jest zmienną indywiduową, to <math>\forall x\var\varphi</math> jest też formułą. | ||
jest też | |||
* | |||
<math>\forall x\var\varphi</math> jest też | |||
Ponadto, dla każdej formuły <math>\var\varphi</math> | Ponadto, dla każdej formuły <math>\var\varphi</math> definiujemy zbiór ''zmiennych wolnych'' <math>FV(\var\varphi)</math> | ||
definiujemy zbiór | występujących w tej formule: | ||
*<math>FV\bot=\emptyset</math>; | |||
*<math> | *<math>FV{r(t_1,\ldots,t_n)} =\bigcup_{i=1}^n FV{t_i}</math>; | ||
*<math> | *<math>FV{t_1=t_2}=FV{t_1}\cupFV{t_2}</math>; | ||
*<math> | *<math>FV{\var\varphi\to\psi}=FV\var\varphi\cup FV\psi</math>; | ||
*<math> | *<math>FV{\forall x\var\varphi}=FV\var\varphi-\{x\}</math>. | ||
*<math> | |||
Formułę bez kwantyfikatorów nazywamy '' | Formułę bez kwantyfikatorów nazywamy ''formułą otwartą''. | ||
Natomiast formuła bez zmiennych wolnych nazywa się | Natomiast formuła bez zmiennych wolnych nazywa się ''zdaniem'' | ||
lub '' | lub ''formułą zamkniętą''. | ||
}} | }} | ||
Negację, koniunkcję, alternatywę, symbol prawdy i | Negację, koniunkcję, alternatywę, symbol prawdy i równoważność formuł definiujemy podobnie jak w przypadku rachunku zdań. | ||
definiujemy podobnie jak w przypadku rachunku zdań. | Kwantyfikator egzystencjalny | ||
Kwantyfikator | zdefiniujemy jako skrót notacyjny przy pomocy ''uogólnionego prawa | ||
zdefiniujemy jako skrót notacyjny przy pomocy | De Morgana'': | ||
De Morgana | |||
\exists x\var\varphi \hspace{1cm} \ | <span id=""/> | ||
<math>\exists x\var\varphi \hspace{1cm} \text{oznacza} \hspace{1cm} \neg\forall x | |||
\neg\var\varphi. | \neg\var\varphi. | ||
</math> | </math> | ||
W Definicji [[#def-form]] nie zakładamy, że <math>x\in | '''Zmienne wolne a zmienne związane.''' | ||
W Definicji [[#def-form|2.5]] nie zakładamy, że <math>x\in FV\var\varphi</math>. | |||
Zauważmy też, | Zauważmy też, | ||
że zmienna <math>x</math> może występować w formule <math>\var\varphi</math> podczas gdy | że zmienna <math>x</math> może występować w formule <math>\var\varphi</math>, podczas gdy | ||
<math>x\not\in | <math>x\not\in FV\var\varphi</math>. Przez ''wystąpienie'' zmiennej indywiduowej <math>x</math> | ||
rozumiemy tu zwykłe pojawienie się <math>x</math> w jakimkolwiek termie w <math>\var\varphi</math>. I tak | rozumiemy tu zwykłe pojawienie się <math>x</math> w jakimkolwiek termie w <math>\var\varphi</math>. I tak | ||
na przykład w formule | na przykład w formule <ref name="trzy">Zakładamy tu, że <math>s</math> oraz <math>r</math> są symbolami | ||
relacji. | relacji.</ref> <math>\exists x\forall u(r(x,y)\to \forall y\exists x\,s(x,y,z))</math> zmienna | ||
<math>u</math> nie występuje, podczas gdy <math>x</math> i <math>y</math> | <math>u</math> nie występuje, podczas gdy <math>x</math> i <math>y</math> wystepują po dwa razy, a <math>z</math> występuje | ||
jeden raz. | jeden raz. | ||
Bardzo | |||
Bardzo ważną rzeczą jest rozróżnienie wystąpień zmiennych ''wolnych'' i ''związanych'' w formułach. Wszystkie wystąpienia zmiennych | |||
w formułach | w formułach | ||
atomowych | atomowych są wolne. Wolne (związane) wystąpienia w formułach | ||
<math>\var\varphi</math> i <math>\psi</math> pozostają wolne (związane) w formule <math>\var\varphi\to\psi</math>. Wszystkie wolne | |||
wystąpienia <math>x</math> w <math>\var\varphi</math> stają się związanymi wystąpieniami w formule | |||
<math>\exists x\var\varphi</math> (związanymi przez dopisanie kwantyfikatora <math>\exists</math>), a | |||
<math>\exists x\var\varphi</math> | charakter pozostałych wystąpień jest taki sam w <math>\var\varphi</math> i w <math>\exists | ||
charakter pozostałych | |||
x\var\varphi</math>. | x\var\varphi</math>. | ||
Przykładowo w formule < | |||
\forall y\exists x\,s | Przykładowo w formule <math>\exists x\forall u(r(x,\underline{y})\to | ||
\forall y\exists x\,s(x,y,z))</math> podkreślone wystąpienie <math>y</math> jest wolne, a nie | |||
podkreślone jest związane. Obydwa wystąpienia <math>x</math> są zwiazane, ale przez różne | |||
kwantyfikatory. | kwantyfikatory. | ||
Na koniec | Na koniec uwaga o nazwach zmiennych związanych. Rozróżnienie pomiędzy zmiennymi | ||
wolnymi a | wolnymi a związanymi jest analogiczne do rozróżnenia pomiedzy identyfikatorami | ||
lokalnymi a globalnymi w językach programowania. Globalne identyfikatory, | lokalnymi a globalnymi w językach programowania. Globalne identyfikatory, | ||
widoczne na | widoczne na zewnątrz, odpowiadają zmiennym wolnym, podczas gdy lokalne | ||
identyfikatory | identyfikatory (związane np. deklaracją w bloku) nie są widoczne na zewnątrz | ||
zakresu ich deklaracji. | zakresu ich deklaracji. | ||
Intuicyjnie naturalne jest oczekiwanie, | Intuicyjnie naturalne jest oczekiwanie, | ||
że zmiana zmiennej | że zmiana zmiennej | ||
związanej na inną zmienną (tak aby nie wprowadzić konfliktu wynikającego ze | |||
zmiany struktury | zmiany struktury wiązań) nie powinna zmieniać znaczenia formuły.<ref name="cztery">Taka | ||
zamiana zmiennych bywa nazywana <math>\alpha</math>- | zamiana zmiennych bywa nazywana <math>\alpha</math>-''konwersją''.</ref> Tak w istocie | ||
będzie, jak się przekonamy poniżej | będzie, jak się przekonamy poniżej (Fakt [[#alfa-konw|2.12]]). | ||
===Semantyka formuł=== | ===Semantyka formuł=== | ||
Niech <math>\Sigma</math> będzie | Niech <math>\Sigma</math> będzie sygnaturą. ''Struktura'' <math>\mathfrak A</math> nad | ||
sygnaturą <math>\Sigma</math> (lub po prostu <math>\Sigma</math>-struktura) to | |||
niepusty zbiór <math>A</math>, zwany | niepusty zbiór <math>A</math>, zwany ''nośnikiem'', wraz z | ||
interpretacją każdego symbolu operacji <math>f\in\Sigma^F_n</math> jako | |||
funkcji <math>n</math> argumentowej <math>f^{\strA}:A^n\to A</math> oraz każdego symbolu | funkcji <math>n</math> argumentowej <math>f^{\strA}:A^n\to A</math> oraz każdego symbolu | ||
relacji <math>r\in\Sigma^R_n</math> | relacji <math>r\in\Sigma^R_n</math> | ||
jako relacji <math>n</math>-argumentowej <math>r^{\ | jako relacji <math>n</math>-argumentowej <math>r^{\mathfrak A}\subseteq A^n</math>. | ||
(Na przykład, jeśli <math>\Sigma</math> składa się z jednego symbolu relacji | |||
dwuargumentowej, to każdy graf zorientowany jest <math>\Sigma</math>- | dwuargumentowej, to każdy graf zorientowany jest <math>\Sigma</math>-strukturą.) | ||
W praktyce, strukturę | W praktyce, strukturę relacyjną przedstawia się jako | ||
krotkę postaci | krotkę postaci | ||
<math>\ | <math>\mathfrak A = \<A, f_1^\mathfrak A,\ldots,f_n^\mathfrak A,r_1^\mathfrak A,\ldots, r_m^\mathfrak A\></math>, gdzie | ||
<math>f_1,\ldots,f_n,r_1,\ldots, r_m</math> | <math>f_1,\ldots,f_n,r_1,\ldots, r_m</math> są wszystkimi symbolami danej sygnatury. | ||
Często, | Często, | ||
gdy będzie jasne z kontekstu z | gdy będzie jasne z kontekstu z jaką strukturą mamy do czynienia, będziemy | ||
opuszczać nazwę struktury i pisać po prostu <math>r, f,\dots</math> zamiast | opuszczać nazwę struktury i pisać po prostu <math>r, f,\dots</math> zamiast | ||
<math>r^\ | <math>r^\mathfrak A, f^\mathfrak A,\dots</math> | ||
''Wartościowaniem'' w <math>\Sigma</math>-strukturze <math>\mathfrak A</math> nazwiemy | |||
dowolną funkcję <math>\varrho:X\to A</math>. Dla wartościowania <math>\varrho</math>, zmiennej | |||
<math>x\in | <math>x\in X</math> oraz elementu <math>a\in A</math> definiujemy nowe wartościowanie | ||
<math>\varrho_x^a:X\to A</math>, | <math>\varrho_x^a:X\to A</math>, będące modyfikacją wartościowania <math>\varrho</math> na | ||
argumencie <math>x</math>, w | argumencie <math>x</math>, w następujący sposób, | ||
<span id=""/> | <span id=""/> | ||
\varrho_x^a\begin{ | <math>\varrho_x^a(y)= \begin{cases} \varrho(y)}, \mbox{jeśli} y\neq x \\ | ||
</math> | a, \mbox{w przeciwnym wypadku} \end{cases}</math> | ||
Najpierw zdefiniujemy znaczenie termów. Wartość termu <math>t\in T_\Sigma(X)</math> w <math>\Sigma</math>-strukturze <math>\mathfrak A</math> przy wartościowaniu <math>\varrho</math> oznaczamy przez <math>{[[t]]}^{\mathfrak A}_\varrho</math>, lub <math>[[t]]\varrho</math>, gdy <math>\mathfrak A</math> jest znane. Definicja jest indukcyjna: | |||
*<math>[[x]]^{\mathfrak A}_\varrho=\varrho(x)</math>. | |||
*<math>[[{f(t_1,\ldots,t_n)}]]^{\mathfrak A}_\varrho= f^\mathfrak A([[{t_1}]]{\mathfrak A}_\varrho,\ldots,[[{t_1}]]^{\mathfrak A}_\varrho)</math>. | |||
Znaczenie formuł definiujemy poniżej. Napis | |||
<center> <math>(\mathfrak A , \varrho ) \vDash \var\varphi</math> </center> | |||
< | |||
czytamy: formuła <math>\var\varphi</math> jest ''spełniona'' w strukturze <math>\mathfrak A</math> przy | |||
wartościowaniu <math>\varrho</math>. Zakładamy tu, że <math>\var\varphi</math> oraz <math>\mathfrak A</math> są nad tą | |||
czytamy: formuła <math>\var\varphi</math> jest ''spełniona | samą sygnaturą. Spełnianie definiujemy przez indukcję ze względu na budowę | ||
w strukturze <math>\ | |||
formuły <math>\var\varphi</math>. | formuły <math>\var\varphi</math>. | ||
*Nie zachodzi <math>(\mathfrak A , \varrho ) \vDash \bot</math>. | |||
*Dla dowolnego <math>n\geq 1</math>, <math>r\in\Sigma^R_n</math> oraz dla dowolnych termów <math>t_1,\ldots, t_n</math>, przyjmujemy, że <math>(\mathfrak A , \varrho ) \vDash r(t_1,\ldots,t_n)</math> wtedy i tylko wtedy, gdy <math>\langle [[t_1]]^{\mathfrak A}_\varrho, \ldots [[t_2]]^{\mathfrak A}_\varrho \rangle \in r^{\mathfrak A</math>. | |||
*<math>(\mathfrak A , \varrho ) \vDash t_1 = t_2</math>, wtedy i tylko wtedy, gdy <math>[[t_1]]^{\mathfrak A}_\varrho = [[t_2]]^{\mathfrak A}_\varrho</math> | |||
*<math>(\mathfrak A , \varrho ) \vDash \var\varphi \to \psi</math> , gdy nie zachodzi <math>( \mathfrak A , \varrho ) \vDash \varphi</math> lub zachodzi <math>( \mathfrak A , \varrho ) \vDash \psi</math> | |||
*<math>(\mathfrak A , \varrho ) \vDash \forall x\var\varphi</math> wtedy i tylko wtedy, gdy dla dowolnego <math>a \in A</math> zachodzi <math>(\mathfrak A, \varrho ^a_x ) \vDash \varphi</math> | |||
strukturze zależy jedynie od | Nastepujące twierdzenie pokazuje, że spełnianie formuły <math>\var\varphi</math> w dowolnej strukturze zależy jedynie od wartości zmiennych wolnych <math>FV(\var\varphi)</math>. Uzasadnia ono następującą konwencję notacyjną: napiszemy na przykład <math>( \mathfrak A , x:a,y:b ) \vDash \var\varphi</math> zamiast <math>(\mathfrak A, \varrho )\vDash \var\varphi</math>, gdy <math>\varrho(x)=a</math> i <math>\varrho(y)=b</math>, a przy tym wiadomo, że w formule <math>\var\varphi</math> występują wolno | ||
Uzasadnia ono | |||
napiszemy na przykład <math>\ | |||
<math>\ | |||
a przy tym wiadomo, że w formule <math>\var\varphi</math> | |||
tylko zmienne <math>x</math> i <math>y</math>. | tylko zmienne <math>x</math> i <math>y</math>. | ||
Jeśli <math>\var\varphi</math> jest zdaniem, to wartościowanie można całkiem pominąć. | |||
{{fakt||zm-wolne| | {{fakt|2.6|zm-wolne| | ||
Dla dowolnej <math>\Sigma</math>-struktury <math>\ | Dla dowolnej <math>\Sigma</math>-struktury <math>\mathfrak A</math> i dowolnej formuły <math>\var\varphi</math>, jeśli | ||
wartościowania <math>\varrho</math> i <math>\varrho'</math> przyjmują równe wartości dla wszystkich | |||
zmiennych wolnych w <math>\var\varphi</math>, to | zmiennych wolnych w <math>\var\varphi</math>, to | ||
}} | <center> <math>(\mathfrak A,\varrho) \vDash\var\varphi</math> wtedy i tylko wtedy, gdy <math>( \mathfrak A, \varrho') \vDash\var\varphi</math></center> | ||
}} | |||
{{dowod||| | |||
Ćwiczenie. | |||
}} | |||
=== | ===Prawdziwość i spełnialność formuł=== | ||
Powiemy, że formuła <math>\var\varphi </math> jest ''spełnialna w <math>\ | Powiemy, że formuła <math>\var\varphi</math> jest ''spełnialna w <math>\mathfrak A</math>'', | ||
gdy istnieje | gdy istnieje | ||
wartościowanie <math>\varrho</math> w strukturze <math>\mathfrak A</math> takie, że zachodzi | |||
<math>\ | <math>(\mathfrak A,\varrho) \vDash\var\varphi</math>. Formuła <math>\var\varphi</math> jest ''spełnialna'', gdy istnieje struktura <math>\mathfrak A</math>, w której <math>\var\varphi</math> jest | ||
spełnialna | |||
spełnialna. | spełnialna. | ||
Formuła <math>\var\varphi</math> jest | Formuła <math>\var\varphi</math> jest ''prawdziwa'' w <math>\mathfrak A</math>, gdy dla | ||
każdego | każdego wartościowania <math>\varrho</math> w <math>\mathfrak A</math> zachodzi <math>(\mathfrak A,\varrho)\vDash\var\varphi</math>. | ||
W tym przypadku mówimy też, że <math>\ | W tym przypadku mówimy też, że <math>\mathfrak A</math> jest ''modelem'' dla formuły | ||
<math>\var\varphi</math> | <math>\var\varphi</math> (oznaczamy to przez <math>\mathfrak A\models\var\varphi</math>). Dla zbioru formuł | ||
<math>\Gamma</math> i <math>\Sigma</math>-struktury <math>\ | <math>\Gamma</math> i <math>\Sigma</math>-struktury <math>\mathfrak A</math> | ||
powiemy, że <math>\ | powiemy, że <math>\mathfrak A</math> jest modelem dla <math>\Gamma</math> (piszemy | ||
<math>\ | <math>\mathfrak A\models\Gamma</math>), gdy dla każdej formuły <math>\var\varphi\in\Gamma</math>, | ||
zachodzi <math>\ | zachodzi <math>\mathfrak A\models\var\varphi</math>. | ||
Formuła <math>\var\varphi</math> jest | Formuła <math>\var\varphi</math> jest ''tautologią'' (oznaczamy to przez | ||
<math>\models\var\varphi</math> | <math>\models\var\varphi</math>), gdy jest ona | ||
prawdziwa | prawdziwa w każdej <math>\Sigma</math>-strukturze. | ||
Oczywiście jeśli weźmiemy dowolną tautologię rachunku zdań, to po | |||
podstawieniu na miejsce zmiennych zdaniowych dowolnych formuł logiki | podstawieniu na miejsce zmiennych zdaniowych dowolnych formuł logiki | ||
pierwszego rzędu dostaniemy tautologię logiki pierwszego | pierwszego rzędu dostaniemy tautologię logiki pierwszego | ||
rzędu. Poniżej podajemy przykłady tautologii logiki pierwszego | rzędu. Poniżej podajemy przykłady tautologii logiki pierwszego rzędu, | ||
których nie da się w ten sposób otrzymać. | których nie da się w ten sposób otrzymać. | ||
{{fakt||taut5| | {{fakt|2.7|taut5| | ||
Następujące formuły są tautologiami logiki pierwszego rzedu: | |||
\forall x\psi\ | # <math>\forall x(\varphi\to\psi)\to(\forall x\varphi\to\forall x\psi)</math>. | ||
</math>x_1=y_1\to | # <math>\varphi\to \forall x \varphi$, o ile $x\not\in\fv\varphi</math>. | ||
f | # <math>\forall x \varphi\to \varphi</math>. | ||
r | # <math>x=x</math>. | ||
# <math>x_1=y_1\to(x_2=y_2\to\cdots\to(x_n=y_n\to f(x_1,\ldots,x_n)=f(y_1,\ldots, y_n))\cdots)</math>, dla <math>f\in\Sigma^F_n</math>, <math>n\geq 0</math>. | |||
# <math>x_1=y_1\to(x_2=y_2\to\cdots\to(x_n=y_n\to r(x_1,\ldots,x_n)\to r(y_1,\ldots, y_n))\cdots)</math>, dla <math>r\in\Sigma^R_n, n\geq 1</math>. | |||
}} | }} | ||
{{dowod|| | |||
{{dowod||| | |||
Aby się przekonać, że formuła | Aby się przekonać, że formuła (1) jest tautologią, rozpatrzmy dowolną strukturę <math>\mathfrak A</math> i jakieś wartościowanie <math>\varrho</math>. Załóżmy najpierw, że <math>(\mathfrak A,\varrho) \vDash \forall x(\var\varphi\to\psi)</math> | ||
rozpatrzmy | oraz <math>(\mathfrak A,\varrho) \vDash \forall x\,\var\varphi</math>. Oznacza to, że | ||
dla dowolnego <math>a\in A</math> zachodzi <math>(\mathfrak A,\varrho^a_x) \vDash \var\varphi</math> oraz | |||
Załóżmy najpierw, że <math>\ | <math>(\mathfrak A,\varrho^a_x) \vDash \var\varphi\to\psi</math>. Musi więc zajść <math>(\mathfrak A,\varrho^a_x) \vDash \psi</math> Z dowolności <math>a</math> mamy <math>(\mathfrak A,\varrho) \vDash \forall x\psi</math>, a stąd <math>(\mathfrak A,\varrho) \vDash \forall x(\var\varphi\to\psi) \to (\forall x \varphi \to \forall x \psi)</math>. | ||
oraz <math>\ | |||
dla dowolnego <math>a\in A</math> | |||
zachodzi <math>\ | |||
<math>\ | |||
<math>\ | |||
\forall x\psi | |||
Jeśli <math>( \mathfrak A, \varrho) \not\models \forall x(\var\varphi\to\psi)</math> lub <math>( \mathfrak A, \varrho) \not\models \forall x \varphi</math>, to nasza formuła jest spełniona przez <math>\varrho</math> wprost z definicji. Uzasadnienie części (3-6) | |||
lub <math>\ | |||
to nasza formuła jest spełniona przez <math>\varrho</math> | |||
wprost z definicji. Uzasadnienie | |||
pozostawiamy czytelnikowi. | pozostawiamy czytelnikowi. | ||
}} | }} | ||
Ponadto mamy | Ponadto mamy następujący | ||
{{fakt||fakt-gen| | |||
{{fakt|2.8|fakt-gen| | |||
Dla dowolnej tautologii < | Dla dowolnej tautologii <math>\var\varphi</math> i dowolnej zmiennej <math>x</math>, formuła <math>\forall x\var\varphi</math> jest też tautologią. | ||
x\var\varphi</math> jest też | |||
}} | }} | ||
{{dowod||| | |||
Ćwiczenie. | Ćwiczenie. | ||
}} | }} | ||
Uzasadnienie, że dana formuła jest | Uzasadnienie, że dana formuła jest tautologią, polega na analizie jej spełniania w dowolnych modelach (por. [[#tatut5|Fakt 2.7]]). Natomiast wykazanie, że tak nie jest, polega na podaniu odpowiedniego kontrprzykładu. Takiego jak ten: | ||
jej spełniania w dowolnych modelach | |||
Natomiast wykazanie, że tak nie | |||
jest polega na podaniu odpowiedniego kontrprzykładu. Takiego jak ten: | |||
{{przyklad|2.9|| | |||
Zdanie <math>(\forall x p(x) \to \forall x q(x)) \to \forall x (p(x) \to q(x))</math> nie jest tautologią. Rozpatrzmy bowiem model <math>\mathfrak A = <\mathbb N, p^\mathfrak A, q^\mathfrak A></math>, w którym: | |||
*<math>n\in p^\mathfrak A</math>, wtedy i tylko wtedy, gdy <math>n</math> jest parzyste; | |||
*<math>n\in q^\mathfrak A</math>, wtedy i tylko wtedy, gdy <math>n</math> jest nieparzyste; | |||
Ponieważ <math>p^\ | Ponieważ <math>p^\mathfrak A\neq\mathbb N</math>, więc <math>\mathfrak A\not\models \forall x p(x)</math>. (Mamy tu do czynienia ze zdaniem, więc wartościowanie jest nieistotne i dlatego je pomijamy.) Stąd otrzymujemy <math>\mathfrak A\models \forall x p(x)\to\forall x q(x)</math>. | ||
Z drugiej strony <math>\mathfrak A\not\models \forall x(p(x)\to q(x))</math>, ponieważ <math>( \mathfrak A,x :2) \not\models p(x) \to q(x)</math>. Rzeczywiście, <math>2\in p^\mathfrak A-q^\mathfrak A</math>. | |||
i dlatego je pomijamy. | }} | ||
<math>\ | |||
Z drugiej strony < | |||
\forall x | |||
}} | |||
===Podstawianie termów=== | ===Podstawianie termów=== | ||
Dla formuły <math>\var\varphi</math>, termu <math>t</math> i zmiennej <math>x</math>, napis | Dla formuły <math>\var\varphi</math>, termu <math>t</math> i zmiennej <math>x</math>, napis | ||
<math> | <math>\var\varphi (t/x)</math> oznacza wynik podstawienia <math>t</math> na wszystkie | ||
''wolne'' wystąpienia <math>x</math> w <math>\var\varphi</math>. Wykonywanie takiego podstawienia | |||
bez dodatkowych zastrzeżeń może prowadzić do kłopotów. | bez dodatkowych zastrzeżeń może prowadzić do kłopotów. | ||
Na przykład sens formuł <math>\forall y | Na przykład sens formuł <math>\forall y (y \leq x)</math> oraz | ||
<math>\forall z | <math>\forall z (z \leq x)</math> jest taki sam. Tymczasem "naiwne" podstawienie | ||
<math>y</math> w miejsce <math>x</math> w obu tych formułach daje w wyniku odpowiednio | <math>y</math> w miejsce <math>x</math> w obu tych formułach daje w wyniku odpowiednio | ||
<math>\forall y | <math>\forall y (y \leq y)</math> i <math>\forall z (z \leq y)</math>, a te dwie formuły | ||
znaczą całkiem co innego. Przyczyną jest to, że w pierwszym | |||
przypadku | przypadku zmienną <math>y</math> wstawiono w zasięg kwantyfikatora <math>\forall y</math>. | ||
Źródłem problemu w powyższym przykładzie było to, że po wykonaniu | |||
podstawienia pojawiały się nowe | podstawienia pojawiały się nowe wiązania kwantyfikatorem. Sugeruje to | ||
następującą definicję. Powiemy, że term <math>t</math> jest ''dopuszczalny'' dla | |||
zmiennej <math>x</math> w formule <math>\var\varphi</math> | zmiennej <math>x</math> w formule <math>\var\varphi</math> (lub że podstawienie <math>\subst\var\varphi tx</math> | ||
jest | jest ''dopuszczalne'', jeśli dla każdej zmiennej <math>y</math> | ||
występującej w <math>t</math>, żadne wolne wystąpienie <math>x</math> w <math>\var\varphi</math> nie jest zawarte | |||
w zasięgu kwantyfikatora <math>\forall y</math> lub <math>\exists y</math>. | w zasięgu kwantyfikatora <math>\forall y</math> lub <math>\exists y</math>. Mamy więc następującą | ||
indukcyjną definicję dopuszczalnego podstawienia,<ref name="piec">Podstawianie | |||
termu <math>t</math> do termu <math>s</math> na miejsce zmiennej <math>x</math> oznaczamy podobnie: | termu <math>t</math> do termu <math>s</math> na miejsce zmiennej <math>x</math> oznaczamy podobnie: | ||
<math> | <math>s(t/x)</math>. Takie podstawienie jest zawsze wykonalne.</ref> w której | ||
każda lewa strona jest dopuszczalna pod warunkiem, że | każda lewa strona jest dopuszczalna pod warunkiem, że | ||
prawa strona jest dopuszczalna. | prawa strona jest dopuszczalna. | ||
*<math> | |||
*< | *<math>\bot (t/x) = \bot</math>, gdy <math>x\not\in FV(\var\varphi)</math>; | ||
r | *<math>r(t_1,\ldots,t_n)(t/x) = r(t_1(t/x),\ldots,t_n(t/x))</math>; | ||
*< | *<math>(t_1=t_2)(t/x) = (t_1(t/x) = t_2(t/x)</math>; | ||
*<math>(\var\varphi\to\psi)(t/x) = \var\varphi(t/x)\to\psi(t/x)</math>; | |||
*<math> | *<math>(\forall x\var\varphi)(t/x) = \forall x\var\varphi</math>; | ||
*<math> | *<math>(\forall y\var\varphi)(t/x) = \forall y\var\varphi(t/x)</math>, gdy <math>y\not= x</math>, oraz <math>y\not\in FV(t)</math>; | ||
*<math> | |||
gdy <math>y\not= x</math>, oraz <math>y\not\in FV | |||
*W pozostałych przypadkach podstawienie jest niedopuszczalne. | *W pozostałych przypadkach podstawienie jest niedopuszczalne. | ||
W dalszym | W dalszym ciągu będziemy rozważać jedynie podstawienia dopuszczalne. | ||
będziemy rozważać jedynie podstawienia dopuszczalne. | |||
{{lemat|2.10 (o podstawieniu)|lem-pier-1| | |||
Niech <math>\ | Niech <math>\mathfrak A</math> będzie dowolną strukturą oraz <math>\varrho:X \to A</math> dowolnym | ||
wartościowaniem w <math>\mathfrak A</math>. Niech <math>t</math> będzie dowolnym termem. | |||
gdzie <math>a=\ | # Dla dowolnego termu <math>s</math> i zmiennej <math>x</math> mamy <center><math>[[s(t/x)]]^{\mathfrak A}_\varrho = [[s]]^{\mathfrak A}_{\varrho^a_x}</math></center> gdzie <math>a=[[t]]^{\mathfrak A}_\varrho</math>. | ||
# Dla dowolnej formuły <math>\var\varphi</math>, jeśli term <math>t</math> jest dopuszczalny dla <math>x</math> w <math>\var\varphi</math>, to | |||
<center><math>(\mathfrak A, \varrho) \models \varphi(t/x)</math> wtedy i tylko wtedy, gdy <math>(\mathfrak A, \varrho^a_x) \models \varphi</math></center> gdzie <math>a=[[t]]^{\mathfrak A}_\varrho</math>. | |||
}} | |||
{{dowod||| | |||
Część 1 dowodzimy przez indukcję ze względu na budowę termu <math>s</math>. Jeśli <math>s</math> jest zmienną <math>x</math>, to obie strony | |||
</math> | są równe <math>[[t]]^{\mathfrak A}_\varrho</math>. Jeśli <math>s</math> jest zmienną <math>y</math> (różną od <math>x</math>), | ||
to obie strony są równe <math>\varrho(y)</math>. Jeśli <math>s</math> jest postaci <math>f(s_1,\ldots,s_n)</math>, to mamy następujące równości. | |||
<center> <math> | |||
[[s(t/x)]]^{\mathfrak A}_\varrho = [[f(s_1(t/x), \ldots, s_n(t/x))]]^{\mathfrak A}_\varrho</math><br> | |||
<math>= f^{\mathfrak A}([[s_1(t/x)]]^{\mathfrak A}_\varrho, \ldots, [[s_n(t/x)]]^{\mathfrak A}_\varrho)</math><br> | |||
<math>= f^{\mathfrak A}([[s_1]]^{\mathfrak A}_{\varrho^a_x}, \ldots, [[s_n]]^{\mathfrak A}_{\varrho^a_x})</math><br> | |||
<math>= [[f(s_1,\ldots,s_n)]]^{\mathfrak A}_{\varrho^a_x} = [[s]]^{\mathfrak A}_{\varrho^a_x} | |||
</math> | |||
</center> | |||
\ | Dowód części 2 przeprowadzamy przez indukcję ze względu na budowę | ||
formuły <math>\var\varphi</math>. Jeśli <math>\var\varphi</math> jest | |||
postaci <math>\bot</math>, to teza jest | |||
oczywista. Jeśli <math>\var\varphi</math> jest formułą atomową, to | |||
tezę natychmiast dostajemy z wyżej udowodnionej części 1. Na | |||
przykład, jeśli <math>\var\varphi</math> jest postaci <math>s_1=s_2</math> to mamy: | |||
<center><math>(\mathfrak A, \varrho) \models \varphi(t/x)</math> wtedy i tylko wtedy, gdy <math>[[s_1(t/x)]]^{\mathfrak A}_\varrho = [[s_1(t/x)]]^{\mathfrak A}_\varrho</math><br> | |||
wtedy i tylko wtedy, gdy <math>[[s_1]]^{\mathfrak A}_{\varrho^a_x} = [[s_2]]^{\mathfrak A}_{\varrho^a_x}</math><br> | |||
wtedy i tylko wtedy, gdy <math>(\mathfrak A, \varrhp^a_x) \models s_1 = s_2</math> | |||
</center> | |||
Druga z powyższych równoważności wynika z części 1. | |||
Druga z powyższych | |||
Krok indukcyjny dla przypadku, gdy <math>\var\varphi</math> jest postaci | Krok indukcyjny dla przypadku, gdy <math>\var\varphi</math> jest postaci | ||
<math>\psi\ | <math>\psi \to \vartheta</math> jest | ||
oczywisty i pozostawimy go czytelnikowi. Rozważymy przypadek gdy | oczywisty i pozostawimy go czytelnikowi. Rozważymy przypadek, gdy | ||
<math>\var\varphi</math> jest postaci <math>\forall y\psi</math>. | <math>\var\varphi</math> jest postaci <math>\forall y\psi</math>. Jeśli zmienne <math>x</math> oraz <math>y</math> są | ||
równe, to <math>x</math> nie występuje wolno w <math>\var\varphi</math> i wówczas teza | równe, to <math>x</math> nie występuje wolno w <math>\var\varphi</math> i wówczas teza | ||
wynika natychmiast z | wynika natychmiast z [[#zm-wolne|Faktu 2.6]]. Tak więc | ||
przyjmijmy, że <math>x</math> oraz <math>y</math> | przyjmijmy, że <math>x</math> oraz <math>y</math> są różnymi zmiennymi. | ||
Wówczas z | Wówczas z dopuszczalności <math>t</math> dla <math>x</math> w <math>\var\varphi</math> | ||
wynika, że <math>y</math> nie występuje w <math>t</math>. Ponadto <math>\subst\var\varphi tx</math> | wynika, że <math>y</math> nie występuje w <math>t</math>. Ponadto <math>\subst\var\varphi tx</math> | ||
jest identyczne z <math>\forall y\subst\psi tx</math>. Mamy | jest identyczne z <math>\forall y\subst\psi tx</math>. Mamy następujące | ||
równoważności: | |||
\ | <center> <math>(\mathfrak A, \varrho) \models \forall y \psi(t/x)</math> wtedy i tylko wtedy, gdy dla każdego <math>d \in A, (\mathfrak A, \varrho^d_y) \models \psi(t/x)</math><br> | ||
każdego | wtedy i tylko wtedy, gdy dla każdego <math>d \in A, (\mathfrak A, \varrho^{d a'}_{y x}) \models \psi</math> | ||
d\in A,\ | </center> | ||
gdzie <math>a'=[[t]]^{\mathfrak A}_{\varrho^d_y}</math>. Ponieważ <math>y</math> nie występuje w <math>t</math>, | |||
więc <math>a'=[[t]]^{\mathfrak A}_{\varrho^d_y} = [[t]]^{\mathfrak A}_\varrho = a</math>. | |||
gdzie <math>a'= | Skoro zmienne <math>x</math> oraz <math>y</math> są różne, to | ||
więc <math>a'= | <math>\varrho^{d\ : a}_{y\ : x}=\varrho^{a\ : d}_{x\ :y}</math>. Tak więc | ||
Skoro zmienne <math>x</math> oraz <math>y</math> | warunek <math>(\mathfrak A, \varrho^{d\ : a'}_{y\ : x}) \models \psi</math> | ||
<math>\varrho^{d\: a}_{y\: x}=\varrho^{a\: d}_{x\:y}</math>. Tak więc | jest równoważny warunkowi <math>( \mathfrak A, \varrho^{a\ : d}_{x\ : y}) \models \psi</math>, | ||
warunek | |||
jest równoważny warunkowi <math>\ | |||
dla każdego <math>d\in A</math>. Czyli | dla każdego <math>d\in A</math>. Czyli | ||
<center><math>(\mathfrak A, \varrho^a_x) \models \forall y \psi</math></center> | |||
Natychmiastowym wnioskiem z | }} | ||
Natychmiastowym wnioskiem z [[#lem-pier-1|Lematu 2.10]] jest | |||
następujący przykład tautologii. | |||
{{fakt||fa-pier-1| | {{fakt|2.11|fa-pier-1| | ||
Dla dowolnej formuły <math>\var\varphi</math>, zmiennej <math>x</math> i termu <math>t</math> | Dla dowolnej formuły <math>\var\varphi</math>, zmiennej <math>x</math> i termu <math>t</math> | ||
dopuszczalnego dla <math>x</math> w <math>\var\varphi</math>, formuła | dopuszczalnego dla <math>x</math> w <math>\var\varphi</math>, formuła | ||
<center><math>\forall x\var\varphi\to\var\varphi(t/x)</math></center> | |||
jest | jest tautologią logiki pierwszego rzędu. | ||
}} | }} | ||
{{dowod|| | {{dowod||| | ||
Ćwiczenie. | Ćwiczenie. | ||
}} | }} | ||
{{fakt||alfa-konw| | {{fakt|2.12|alfa-konw| | ||
Jeśli zmienna <math>y</math> jest dopuszczalna dla <math>x</math> w <math>\var\varphi</math> oraz | |||
<math>y\not\in\fv\var\varphi</math>, to | <math>y\not\in\fv\var\varphi</math>, to | ||
<center><math>\models(\forall x\var\varphi)\leftrightarrow (\forall y \var\varphi(y/x))</math></center>. | |||
\models | |||
}} | }} | ||
\models\forall y | {{dowod||| | ||
</math> | Z [[#fa-pier-1|Faktu 2.11]] oraz [[#fakt-gen|Faktu 2.8]] otrzymujemy | ||
Zatem na mocy | <center><math>\models \forall y(\forall x \varphi \to \varphi(y/x))</math></center> | ||
Zatem na mocy [[#taut5|Faktu 2.7(1)]] wnioskujemy, że | |||
\models | <center><math>\models (\forall y \forall x \varphi) \to (\forall y \varphi (y/x))</math>.</center> | ||
</ | |||
Na mocy | Na mocy [[#taut5|Przykładu 2.7(2)]] otrzymujemy implikację <math>\to</math>. Odwrotna implikacja wynika z już udowodnionej | ||
implikacji oraz z następujących prostych obserwacji: | |||
*Jeśli <math>y</math> jest dopuszczalna dla <math>x</math> w <math>\var\varphi</math>, to <math>x</math> jest dopuszczalna dla <math>y</math> w <math>\var\varphi(y/x)</math>. | |||
* | *Jeśli <math>y\not\in FV\var\varphi</math>, to <math>x</math> nie występuje wolno w <math>\var\varphi(y/x)</math>. | ||
<math>\var\varphi</math>, to <math>x</math> jest dopuszczalna dla <math>y</math> w <math> | *Wynik podstawienia <math>\var\varphi(y/x)(x/y)</math> jest identyczny z <math>\var\varphi</math>. | ||
* | |||
<math> | |||
*Wynik podstawienia <math> | |||
z <math>\var\varphi</math>. | |||
}} | |||
[[#alfa-konw|Fakt 2.12]] pozwala zamieniać zmienne związane dowolnie, tak długo jak | |||
są spełnione założenia. W szczególności jeśli chcemy wykonać podstawienie termu | |||
do formuły w sytuacji, gdy ten term nie jest dopuszczalny to wystarczy zamienić | do formuły w sytuacji, gdy ten term nie jest dopuszczalny to wystarczy zamienić | ||
nazwy pewnych zmiennych | nazwy pewnych zmiennych związanych, tak aby term stał się dopuszczalny. | ||
Łatwo jest | Łatwo jest uogólnić [[#alfa-konw|Fakt 2.12]]: znaczenie formuły nie ulega zmianie | ||
także przy wymianie | także przy wymianie | ||
zmiennych | zmiennych związanych kwantyfikatorami wystepującymi | ||
wewnątrz formuły. | |||
===Przypisy=== | |||
< | <references/> |
Aktualna wersja na dzień 22:15, 11 wrz 2023
Język logiki pierwszego rzędu.
Język logiki pierwszego rzędu <ref name="dwa">Logika pierwszego rzędu nazywana jest też rachunkiem predykatów lub rachunkiem kwantyfikatorów.</ref> można traktować jak rozszerzenie rachunku zdań, pozwalające formułować stwierdzenia o zależnościach pomiędzy obiektami indywiduowymi (np. relacjach i funkcjach). Dzięki zastosowaniu kwantyfikatorów, odwołujących się do całej zbiorowości rozważanych obiektów, można w logice pierwszego rzędu wyrażać własności struktur relacyjnych oraz modelować rozumowania dotyczące takich struktur. Do zestawu symboli rachunku zdań dodajemy następujące nowe składniki syntaktyczne:
- Symbole operacji i relacji (w tym symbol równości );
- Zmienne indywiduowe, których wartości mają przebiegać rozważane dziedziny;
- Kwantyfikatory, wiążące zmienne indywiduowe w formułach.
Składnia
Symbole operacji i relacji są podstawowymi składnikami do budowy najprostszych formuł, tzw. formuł atomowych. Z tego względu w języku pierwszego rzędu rezygnuje się ze zmiennych zdaniowych.
Definicja 2.1
Przez sygnaturę rozumieć będziemy rodzinę zbiorów , dla oraz rodzinę zbiorów , dla . Elementy będziemy nazywać symbolami operacji -argumentowych, a elementy będziemy nazywać symbolami relacji -argumentowych. Przyjmujemy, że wszystkie te zbiory są parami rozłączne. Umawiamy się też, że znak równości nie należy do . Symbol ten nie jest zwykłym symbolem relacyjnym, ale jest traktowany na specjalnych prawach. W praktyce, sygnatura zwykle jest skończona i zapisuje się ją jako ciąg symboli. Np. ciąg złożony ze znaków (o znanej każdemu liczbie argumentów) tworzy sygnaturę języka teorii ciał.
Definicja 2.2
Ustalamy pewien nieskończony przeliczalny zbiór symboli, które będziemy nazywać zmiennymi indywiduowymi i zwykle oznaczać symbolami . Zbiór termów nad sygnaturą i zbiorem zmiennych definiujemy indukcyjnie:
- Zmienne indywiduowe są termami.
- Dla każdego i każdego symbolu operacji , jeśli są termami, to jest też termem.
Zauważmy, że z powyższej definicji wynika, iż stałe sygnatury (czyli symbole operacji zeroargumentowych) są termami.
Definicja 2.3
Dla każdego termu definiujemy zbiór Parser nie mógł rozpoznać (nieznana funkcja „\fv”): {\displaystyle \fv t} zmiennych występujących w . Definicja jest indukcyjna:
- .
- Parser nie mógł rozpoznać (nieznana funkcja „\fv”): {\displaystyle FV(f(t_1,\ldots, t_n))=\bigcup_{i=1}^n \fv{t_i}} .
Definicja 2.4
Następnie zdefiniujemy formuły atomowe języka pierwszego rzędu.
- Symbol fałszu jest formułą atomową.
- Dla każdego , każdego symbolu relacji -argumentowej oraz dla dowolnych termów , napis jest formułą atomową.
- Dla dowolnych termów , napis jest formułą atomową.
Konwencja: Niektóre dwuargumentowe symbole relacyjne (np. ) i funkcyjne (np. ) są zwyczajowo pisane pomiędzy argumentami. Na przykład formułę atomową zwykle piszemy jako "".
Definicja 2.5
Formuły nad sygnaturą i zbiorem zmiennych indywiduowych definiujemy indukcyjnie.
- Każda formuła atomowa jest formułą.
- Jeśli Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi,\psi} są formułami, to Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle (\var\varphi\to\psi)} jest też formułą.
- Jeśli Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi} jest formułą, a jest zmienną indywiduową, to Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \forall x\var\varphi} jest też formułą.
Ponadto, dla każdej formuły Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi} definiujemy zbiór zmiennych wolnych Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle FV(\var\varphi)} występujących w tej formule:
- ;
- ;
- Parser nie mógł rozpoznać (nieznana funkcja „\cupFV”): {\displaystyle FV{t_1=t_2}=FV{t_1}\cupFV{t_2}} ;
- Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle FV{\var\varphi\to\psi}=FV\var\varphi\cup FV\psi} ;
- Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle FV{\forall x\var\varphi}=FV\var\varphi-\{x\}} .
Formułę bez kwantyfikatorów nazywamy formułą otwartą. Natomiast formuła bez zmiennych wolnych nazywa się zdaniem lub formułą zamkniętą.
Negację, koniunkcję, alternatywę, symbol prawdy i równoważność formuł definiujemy podobnie jak w przypadku rachunku zdań. Kwantyfikator egzystencjalny zdefiniujemy jako skrót notacyjny przy pomocy uogólnionego prawa De Morgana:
Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \exists x\var\varphi \hspace{1cm} \text{oznacza} \hspace{1cm} \neg\forall x \neg\var\varphi. }
Zmienne wolne a zmienne związane.
W Definicji 2.5 nie zakładamy, że Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle x\in FV\var\varphi}
.
Zauważmy też,
że zmienna może występować w formule Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi}
, podczas gdy
Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle x\not\in FV\var\varphi}
. Przez wystąpienie zmiennej indywiduowej
rozumiemy tu zwykłe pojawienie się w jakimkolwiek termie w Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi}
. I tak
na przykład w formule <ref name="trzy">Zakładamy tu, że oraz są symbolami
relacji.</ref> zmienna
nie występuje, podczas gdy i wystepują po dwa razy, a występuje
jeden raz.
Bardzo ważną rzeczą jest rozróżnienie wystąpień zmiennych wolnych i związanych w formułach. Wszystkie wystąpienia zmiennych w formułach atomowych są wolne. Wolne (związane) wystąpienia w formułach Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi} i pozostają wolne (związane) w formule Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi\to\psi} . Wszystkie wolne wystąpienia w Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi} stają się związanymi wystąpieniami w formule Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \exists x\var\varphi} (związanymi przez dopisanie kwantyfikatora ), a charakter pozostałych wystąpień jest taki sam w Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi} i w Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \exists x\var\varphi} .
Przykładowo w formule podkreślone wystąpienie jest wolne, a nie podkreślone jest związane. Obydwa wystąpienia są zwiazane, ale przez różne kwantyfikatory.
Na koniec uwaga o nazwach zmiennych związanych. Rozróżnienie pomiędzy zmiennymi wolnymi a związanymi jest analogiczne do rozróżnenia pomiedzy identyfikatorami lokalnymi a globalnymi w językach programowania. Globalne identyfikatory, widoczne na zewnątrz, odpowiadają zmiennym wolnym, podczas gdy lokalne identyfikatory (związane np. deklaracją w bloku) nie są widoczne na zewnątrz zakresu ich deklaracji. Intuicyjnie naturalne jest oczekiwanie, że zmiana zmiennej związanej na inną zmienną (tak aby nie wprowadzić konfliktu wynikającego ze zmiany struktury wiązań) nie powinna zmieniać znaczenia formuły.<ref name="cztery">Taka zamiana zmiennych bywa nazywana -konwersją.</ref> Tak w istocie będzie, jak się przekonamy poniżej (Fakt 2.12).
Semantyka formuł
Niech będzie sygnaturą. Struktura nad sygnaturą (lub po prostu -struktura) to niepusty zbiór , zwany nośnikiem, wraz z interpretacją każdego symbolu operacji jako funkcji argumentowej Parser nie mógł rozpoznać (nieznana funkcja „\strA”): {\displaystyle f^{\strA}:A^n\to A} oraz każdego symbolu relacji jako relacji -argumentowej . (Na przykład, jeśli składa się z jednego symbolu relacji dwuargumentowej, to każdy graf zorientowany jest -strukturą.) W praktyce, strukturę relacyjną przedstawia się jako krotkę postaci Parser nie mógł rozpoznać (błąd składni): {\displaystyle \mathfrak A = \<A, f_1^\mathfrak A,\ldots,f_n^\mathfrak A,r_1^\mathfrak A,\ldots, r_m^\mathfrak A\>} , gdzie są wszystkimi symbolami danej sygnatury. Często, gdy będzie jasne z kontekstu z jaką strukturą mamy do czynienia, będziemy opuszczać nazwę struktury i pisać po prostu zamiast
Wartościowaniem w -strukturze nazwiemy
dowolną funkcję . Dla wartościowania , zmiennej
oraz elementu definiujemy nowe wartościowanie
, będące modyfikacją wartościowania na
argumencie , w następujący sposób,
Parser nie mógł rozpoznać (nieznana funkcja „\begin{cases}”): {\displaystyle \varrho_x^a(y)= \begin{cases} \varrho(y)}, \mbox{jeśli} y\neq x \\ a, \mbox{w przeciwnym wypadku} \end{cases}}
Najpierw zdefiniujemy znaczenie termów. Wartość termu w -strukturze przy wartościowaniu oznaczamy przez , lub , gdy jest znane. Definicja jest indukcyjna:
- .
- .
Znaczenie formuł definiujemy poniżej. Napis
czytamy: formuła Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi} jest spełniona w strukturze przy wartościowaniu . Zakładamy tu, że Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi} oraz są nad tą samą sygnaturą. Spełnianie definiujemy przez indukcję ze względu na budowę formuły Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi} .
- Nie zachodzi .
- Dla dowolnego , oraz dla dowolnych termów , przyjmujemy, że wtedy i tylko wtedy, gdy Parser nie mógł rozpoznać (błąd składni): {\displaystyle \langle [[t_1]]^{\mathfrak A}_\varrho, \ldots [[t_2]]^{\mathfrak A}_\varrho \rangle \in r^{\mathfrak A} .
- , wtedy i tylko wtedy, gdy
- Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle (\mathfrak A , \varrho ) \vDash \var\varphi \to \psi} , gdy nie zachodzi lub zachodzi
- Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle (\mathfrak A , \varrho ) \vDash \forall x\var\varphi} wtedy i tylko wtedy, gdy dla dowolnego zachodzi
Nastepujące twierdzenie pokazuje, że spełnianie formuły Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi}
w dowolnej strukturze zależy jedynie od wartości zmiennych wolnych Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle FV(\var\varphi)}
. Uzasadnia ono następującą konwencję notacyjną: napiszemy na przykład Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle ( \mathfrak A , x:a,y:b ) \vDash \var\varphi}
zamiast Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle (\mathfrak A, \varrho )\vDash \var\varphi}
, gdy i , a przy tym wiadomo, że w formule Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi}
występują wolno
tylko zmienne i .
Jeśli Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi}
jest zdaniem, to wartościowanie można całkiem pominąć.
Fakt 2.6
Dla dowolnej -struktury i dowolnej formuły Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi} , jeśli wartościowania i przyjmują równe wartości dla wszystkich zmiennych wolnych w Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi} , to
Dowód
Prawdziwość i spełnialność formuł
Powiemy, że formuła Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi} jest spełnialna w , gdy istnieje wartościowanie w strukturze takie, że zachodzi Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle (\mathfrak A,\varrho) \vDash\var\varphi} . Formuła Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi} jest spełnialna, gdy istnieje struktura , w której Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi} jest spełnialna.
Formuła Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi} jest prawdziwa w , gdy dla każdego wartościowania w zachodzi Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle (\mathfrak A,\varrho)\vDash\var\varphi} . W tym przypadku mówimy też, że jest modelem dla formuły Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi} (oznaczamy to przez Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \mathfrak A\models\var\varphi} ). Dla zbioru formuł i -struktury powiemy, że jest modelem dla (piszemy ), gdy dla każdej formuły Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi\in\Gamma} , zachodzi Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \mathfrak A\models\var\varphi} . Formuła Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi} jest tautologią (oznaczamy to przez Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \models\var\varphi} ), gdy jest ona prawdziwa w każdej -strukturze.
Oczywiście jeśli weźmiemy dowolną tautologię rachunku zdań, to po podstawieniu na miejsce zmiennych zdaniowych dowolnych formuł logiki pierwszego rzędu dostaniemy tautologię logiki pierwszego rzędu. Poniżej podajemy przykłady tautologii logiki pierwszego rzędu, których nie da się w ten sposób otrzymać.
Fakt 2.7
Następujące formuły są tautologiami logiki pierwszego rzedu:
- .
- Parser nie mógł rozpoznać (nieznana funkcja „\fv”): {\displaystyle \varphi\to \forall x \varphi$, o ile $x\not\in\fv\varphi} .
- .
- .
- , dla , .
- , dla .
Dowód
Aby się przekonać, że formuła (1) jest tautologią, rozpatrzmy dowolną strukturę i jakieś wartościowanie . Załóżmy najpierw, że Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle (\mathfrak A,\varrho) \vDash \forall x(\var\varphi\to\psi)} oraz Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle (\mathfrak A,\varrho) \vDash \forall x\,\var\varphi} . Oznacza to, że dla dowolnego zachodzi Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle (\mathfrak A,\varrho^a_x) \vDash \var\varphi} oraz Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle (\mathfrak A,\varrho^a_x) \vDash \var\varphi\to\psi} . Musi więc zajść Z dowolności mamy , a stąd Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle (\mathfrak A,\varrho) \vDash \forall x(\var\varphi\to\psi) \to (\forall x \varphi \to \forall x \psi)} .
Jeśli Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle ( \mathfrak A, \varrho) \not\models \forall x(\var\varphi\to\psi)} lub , to nasza formuła jest spełniona przez wprost z definicji. Uzasadnienie części (3-6) pozostawiamy czytelnikowi.

Ponadto mamy następujący
Fakt 2.8
Dla dowolnej tautologii Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi} i dowolnej zmiennej , formuła Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \forall x\var\varphi} jest też tautologią.
Dowód
Uzasadnienie, że dana formuła jest tautologią, polega na analizie jej spełniania w dowolnych modelach (por. Fakt 2.7). Natomiast wykazanie, że tak nie jest, polega na podaniu odpowiedniego kontrprzykładu. Takiego jak ten:
Przykład 2.9
Zdanie nie jest tautologią. Rozpatrzmy bowiem model , w którym:
- , wtedy i tylko wtedy, gdy jest parzyste;
- , wtedy i tylko wtedy, gdy jest nieparzyste;
Ponieważ , więc . (Mamy tu do czynienia ze zdaniem, więc wartościowanie jest nieistotne i dlatego je pomijamy.) Stąd otrzymujemy . Z drugiej strony , ponieważ . Rzeczywiście, .
Podstawianie termów
Dla formuły Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi} , termu i zmiennej , napis Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi (t/x)} oznacza wynik podstawienia na wszystkie wolne wystąpienia w Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi} . Wykonywanie takiego podstawienia bez dodatkowych zastrzeżeń może prowadzić do kłopotów. Na przykład sens formuł oraz jest taki sam. Tymczasem "naiwne" podstawienie w miejsce w obu tych formułach daje w wyniku odpowiednio i , a te dwie formuły znaczą całkiem co innego. Przyczyną jest to, że w pierwszym przypadku zmienną wstawiono w zasięg kwantyfikatora .
Źródłem problemu w powyższym przykładzie było to, że po wykonaniu podstawienia pojawiały się nowe wiązania kwantyfikatorem. Sugeruje to następującą definicję. Powiemy, że term jest dopuszczalny dla zmiennej w formule Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi} (lub że podstawienie Parser nie mógł rozpoznać (nieznana funkcja „\subst”): {\displaystyle \subst\var\varphi tx} jest dopuszczalne, jeśli dla każdej zmiennej występującej w , żadne wolne wystąpienie w Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi} nie jest zawarte w zasięgu kwantyfikatora lub . Mamy więc następującą indukcyjną definicję dopuszczalnego podstawienia,<ref name="piec">Podstawianie termu do termu na miejsce zmiennej oznaczamy podobnie: . Takie podstawienie jest zawsze wykonalne.</ref> w której każda lewa strona jest dopuszczalna pod warunkiem, że prawa strona jest dopuszczalna.
- , gdy Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle x\not\in FV(\var\varphi)} ;
- ;
- ;
- Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle (\var\varphi\to\psi)(t/x) = \var\varphi(t/x)\to\psi(t/x)} ;
- Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle (\forall x\var\varphi)(t/x) = \forall x\var\varphi} ;
- Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle (\forall y\var\varphi)(t/x) = \forall y\var\varphi(t/x)} , gdy , oraz ;
- W pozostałych przypadkach podstawienie jest niedopuszczalne.
W dalszym ciągu będziemy rozważać jedynie podstawienia dopuszczalne.
Lemat 2.10 (o podstawieniu)
Niech będzie dowolną strukturą oraz dowolnym wartościowaniem w . Niech będzie dowolnym termem.
- Dla dowolnego termu i zmiennej mamy
gdzie . - Dla dowolnej formuły Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi} , jeśli term jest dopuszczalny dla w Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi} , to
Dowód
Część 1 dowodzimy przez indukcję ze względu na budowę termu . Jeśli jest zmienną , to obie strony są równe . Jeśli jest zmienną (różną od ), to obie strony są równe . Jeśli jest postaci , to mamy następujące równości.
Dowód części 2 przeprowadzamy przez indukcję ze względu na budowę formuły Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi} . Jeśli Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi} jest postaci , to teza jest oczywista. Jeśli Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi} jest formułą atomową, to tezę natychmiast dostajemy z wyżej udowodnionej części 1. Na przykład, jeśli Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi} jest postaci to mamy:
wtedy i tylko wtedy, gdy
wtedy i tylko wtedy, gdy Parser nie mógł rozpoznać (nieznana funkcja „\varrhp”): {\displaystyle (\mathfrak A, \varrhp^a_x) \models s_1 = s_2}
Druga z powyższych równoważności wynika z części 1.
Krok indukcyjny dla przypadku, gdy Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi} jest postaci jest oczywisty i pozostawimy go czytelnikowi. Rozważymy przypadek, gdy Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi} jest postaci . Jeśli zmienne oraz są równe, to nie występuje wolno w Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi} i wówczas teza wynika natychmiast z Faktu 2.6. Tak więc przyjmijmy, że oraz są różnymi zmiennymi. Wówczas z dopuszczalności dla w Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi} wynika, że nie występuje w . Ponadto Parser nie mógł rozpoznać (nieznana funkcja „\subst”): {\displaystyle \subst\var\varphi tx} jest identyczne z Parser nie mógł rozpoznać (nieznana funkcja „\subst”): {\displaystyle \forall y\subst\psi tx} . Mamy następujące równoważności:
wtedy i tylko wtedy, gdy dla każdego
gdzie . Ponieważ nie występuje w , więc . Skoro zmienne oraz są różne, to . Tak więc warunek jest równoważny warunkowi , dla każdego . Czyli

Natychmiastowym wnioskiem z Lematu 2.10 jest następujący przykład tautologii.
Fakt 2.11
Dla dowolnej formuły Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi} , zmiennej i termu dopuszczalnego dla w Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi} , formuła
jest tautologią logiki pierwszego rzędu.
Dowód
Fakt 2.12
Jeśli zmienna jest dopuszczalna dla w Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi} oraz Parser nie mógł rozpoznać (nieznana funkcja „\fv”): {\displaystyle y\not\in\fv\var\varphi} , to
Dowód
Z Faktu 2.11 oraz Faktu 2.8 otrzymujemy
Zatem na mocy Faktu 2.7(1) wnioskujemy, że
Na mocy Przykładu 2.7(2) otrzymujemy implikację . Odwrotna implikacja wynika z już udowodnionej implikacji oraz z następujących prostych obserwacji:
- Jeśli jest dopuszczalna dla w Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi} , to jest dopuszczalna dla w Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi(y/x)} .
- Jeśli Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle y\not\in FV\var\varphi} , to nie występuje wolno w Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi(y/x)} .
- Wynik podstawienia Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi(y/x)(x/y)} jest identyczny z Parser nie mógł rozpoznać (nieznana funkcja „\var”): {\displaystyle \var\varphi} .

Fakt 2.12 pozwala zamieniać zmienne związane dowolnie, tak długo jak są spełnione założenia. W szczególności jeśli chcemy wykonać podstawienie termu do formuły w sytuacji, gdy ten term nie jest dopuszczalny to wystarczy zamienić nazwy pewnych zmiennych związanych, tak aby term stał się dopuszczalny. Łatwo jest uogólnić Fakt 2.12: znaczenie formuły nie ulega zmianie także przy wymianie zmiennych związanych kwantyfikatorami wystepującymi wewnątrz formuły.
Przypisy
<references/>