Predikaatloogika

Predikaatloogika (predicate logic) ehk predikaatarvutus (predicate calculus) on maakeeli väitearvutus?

Sissejuhatus

Loogika on üks arvutiteaduse alustalasi kuid loogika õpetamise meetodid jätavad tihtipeale soovida kuna esiteks loogikas kasutatavad sümbolid erinevad märgatavalt programmeerimiskeeltes kasutatavatest operaatoritest ning paljudele õpilastele ei seostu loogika seetõttu tavapäraste programmeerimiskeeltega.

Predikaadid ja funktsioonid

Predikaat on lause või valem (formula), mis sisaldab ühte või mitut muutujat (variables). Predikaatlause tõeväärtus oleneb väärtustatud muutuja(te) tõeväärtus(t)est.

\begin{equation*} P(x) \equiv ... muutujat\:x\:sisaldav\:lause\:või\:valem \end{equation*}
\begin{equation*} P(x, y) \equiv ... muutujaid\:x\:ja\:y\:sisaldav\:lause\:või\:valem \end{equation*}

Ühekohalist predikaati nimetatakse ka omaduseks (property). Kui predikaatmuutuja mingi konkreetse väärtuse n korral predikaatlause P(n) osutub tõeseks, siis ütleme et "n-il on omadus P" (variable n has property P).

Vaatleme näiteks ühekohalist predikaati:

\begin{equation*} P(x) \equiv (x > 2) \land (x < 4) \end{equation*}

Analoogselt saame Pythonis kirja panna funktsiooni P:

def P(x):
    return (x > 2) and (x < 4)

Pythonis nagu ka paljudes teistes funktsionaalsetes programeerimiskeeltes on lambda notatsioon mis näeb pisut matemaatilisem välja ning võimaldab luua anonüümseid ehk nimeta funktsioone:

P = lambda x: (x > 2) and (x < 4)

Kui predikaadi muutujad asendada mingite konkreetsete väärtustega lubatud väärtustehulgast, siis predikaat muutub lauseks ehk omandab tõeväärtuse.

Predikaate tähistatakse suurtähtedega ning temas sisalduvaid (predikaat)muutujaid väiketähtedega. Pythoni koodimistavad näevad küll ette, et funktsioonide nimed kui ka muutujate nimed on väiketähtedega.

Laused, väärtustamine ning funktsioonide välja kutsumine

Väärtustades x = 3 saame tõese predikaatlause, ehk võib öelda, et täisarvul 3 on omadus P:

\begin{equation*} P(3) = (3 > 2) \wedge (x < 4) = 1\:ehk\:tõene \end{equation*}

Pythonis tähendaks see funktsiooni välja kutsumist teatud argumentidega:

>>> P = lambda x: (x > 2) and (x < 4)
>>> P(3)
True

Predikaatmuutujate kohta tuleb eelnevalt täpsustada, milliseid väärtusi ta võib omandada ehk milline on predikaadi määramispiirkond. Programeerimiskeeltes võib leida erinevaid vahendeid määramispiirkonna paika panemiseks: andmetüübid, erindid, klassid (?). Pythoni puhul näiteks:

>>> 5/0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero

Kvantorid

Predikaatlause P(x) võib olla:

  • Täidetav ehk kehtestav - kui ta on tõene ainult osade muutujaväärtuste x korral ehk osas määramispiirkonnas
  • Samaselt tõene - kui ta on tõene (kehtiv) kogu määramispiirkonnas
  • Samaselt väär - kui ta ei kehti mitte mingite muutujaväärtuste korral oma määramispiirkonnas

Kvantorid (quantification):

:=, :⇔, ≡ - definitsioon (*definition), "on defineeritud kui" (is *defined as)

  • ⊢ - pöördrist (turnstile), tõestatav (provable)
  • ⊨ - topelt pöördrist (double turnstile), tähendab (entails)

Equivalence relation

~ ⊆ M × M

~ is an equivalence (equal value) relation if and only if following properties hold:

  1. Reflexivity: ∀a ∈ M, a ~ a
  2. Sümmeetria (symmetry): ∀a ∈ M, a ~ b ⇒ b ~ a
  3. Transitivity: ∀a ∈ M, ca ~ b ∧ b ~ c ⇒ a ~ c

Arvutuspuu loogika (computational tree logic)

Viited

QAoES TU Berlin