Symbolinen logiikka

**Symbolinen logiikka** on matematiikkaa sivuava logiikan osa, joka tutkii merkkijonoina esitettyjen symbolien puhtaita formaaleja ominaisuuksia.   Sille on kaksi tarkoitusta. Ensiksi, filosofisesta logiikan näkökulmasta symbolisen logiikan symbolien nähdään esittävän sanoja. Toiseksi, tietojenkäsittelytieteen näkökulmasta symbolisen logiikan säännöissä käsiteltävät symbolit ovat tietojenkäsittelyprosessin elementtejä.

Symbolinen logiikka jaetaan tavallisesti kahteen alaosaan, propositiologiikkaan ja predikaattilogiikkaan. Muita muotoja ovat temporaalilogiikka, modaalilogiikka ja sumea logiikka.

## Propositiologiikka

Propositiologiikka tutkii lauseiden ominaisuuksia niiden sisältämien vakioiden ja muuttujaviittausten, kuten A, B, C, ... sekä viiden operaattorin, *ja* (AND), *tai* (OR), *jos...niin* [IMPLIES), *jos ja vain jos*' (EQUALS) sekä *ei* (NOT) perusteella. Vastaavat logiikan operaatiot ovat konjunktio, disjunktio, implikaatio, ekvivalenssi, sekä negaatio eli kielto.  Näistä muut paitsi *ei* ovat binaarisia operaatioita. Operaatioiden merkitystä kuvataan totuusarvotaulukoilla.

## Predikaattilogiikka

Predikaattilogiikka on propositiologiikan laajennus, joka tuo mukaan muuttujat, lauseet eli predikaatit. Muuttujat esitetään yleensä pienellä alkukirjaimella *x*, *y*, *z* jne, kun taas predikaatit esitetään isolla alkukirjaimella, esimerkiksi  P(*x*) or Q(*y*,*z*). Sen lisäksi predikaattilogiikkaan liittyvät kvanttorit, jotka kuvaavat tapauksia *kaikki* (universaalikvanttori \forall) ja *[[olemassaolo|on olemassa]]* (eksistenssikvanttori \exists).

## Symbolinen logiikka ja Prolog
Prolog-ohjelmointikieli soveltaa predikaattilogiikkaa, joten se tukee myös symbolista logiikka ja samalla ohjelmointia. Prolog ohjelmat kuvaavat suhteita käyttäen klausuuleja (englanniksi clause). Pelkistettynä Prolog rajoittuu Hornin klausuuleihin, mikä on Turing-vahva ensimmäisen kertaluvun predikaattilogiikan osajoukko.  Siinä on kaksi lausetyyppiä: faktat ja säännöt.  Sääntö on muotoa: 

```
Otsikko :- Runko.
```

Se luetaan seuraavasti "Otsikko on tosi, jos Runko tulee todeksi". Säännön runko koostuu predikaattikutsuista, joita sanotaan säännön tavoitteiksi (goal). 
Prologin sisäänrakennettu toiminto pilkku (`,/2`) tarkoittaa logiikan konjuktiota, kun taas puolipiste (`;/2`) tarkoittaa disjunktiota. Konjunktioita ja disjunktioita voi esiintyä runko-osassa, mutta ei säännön otsikossa.

Sellaisia lauseita, joissa ei ole runko-osaa, kutsutaan faktoiksi. Esimerkiksi tom on kissa:

```
kissa(tom).
```

Fakta toimii kuten pelkistetty relaatiotietokanta. Niinpä Prologilta voidaan kysyä kaikkien kissojen nimet yksitellen: 

```
?- kissa(X).  
 X = tom
```


### Prologin suoritus
Prologin suoritus käynnistyy yhdellä tavoitteella, joita kutsutaan kyselyksi. Prologin päättelykone pyrkii löytämään resoluutioperiaatteen mukaan kielteisen ehdon.

Jos negaatiota ei löydykään, siitä seuraa, että kysely voimassa olevine muuttuja-arvoineen tulee vahvistetuksi. Näin vastaava looginen ketju ohjelmassa toteutuu. Tällöin kaikki generoidut muuttuja-arvot palautuvat käyttäjälle ja kyselyn sanotaan onnistuneen. Toiminnallisesti Prologin suoritusstrategian voidaan ajatella olevan tyypillisten ohjelmointikielten (Java, C++, Pascal) funktiokutsujen yleistys, mutta erityispiirteenä Prologissa on se, että samalle lauseelle voi olla useita vaihtoehtoisia otsikkoja jopa samoilla argumenteilla. Tällaisessa tapauksessa Prolog luo valinta-pisteen, joka yhdistää eri vaihtoehdot. Sitten Prolog alkaa suorittamaan vaihtoehtoja alusta lukien. Jos tietty vaihtoehto toteutuu - niin sanotusta cut-termistä riippuen - pyritään toteuttamaan myös seuraavat valintapisteen (lauseen) vaihtoehdot tai hyväksytään pelkästään yksi vaihtoehto. Jos yksikin kysely lauseen sisällä epäonnistuu, silloin siihen kohdistuvat muuttuja-arvot kumoutuvat ja suoritus palaa edelliseen valintapisteeseen ja se jatkuu seuraavasta vaihtoehdosta, jos sellaisia on jäljellä. Tätä kumoutumis- ja palautumistoimintoa kutsutaan peräytykseksi.
  
Esimerkiksi kaikki ihmiset ovat kuolevaisia ja erityisesti kerrotaan, että Sokrates on ihminen:

```
kuolevainen(X):- ihminen(X). 
 ihminen(Sokrates).
```


Seuraava kysely palauttaa tiedon, että Sokrates on kuolevainen, koska hän on ihminen:

```
?- kuolevainen(Sokrates).
 Yes.
```


## Katso myös
* Symbolinen analyysi

## Lähteet