**Prolog** on tunnetuin logiikkapohjainen ohjelmointikieli. Nimi *Prolog* on lyhenne ranskan kielen sanoista ***PRO**grammation en **LOG**ique*, sananmukaisesti logiikkaohjelmointi. Kielen kehittivät vuonna 1972 Alan Colmerauer, Philippe Roussel ja Robert Kowalski vaihtoehdoksi LISPille.

Logiikkaohjelmointikielenä Prolog poikkeaa melkoisesti proseduraalisista "tavallisista" ohjelmointikielistä. Kielellä tehdyt ohjelmat muodostuvat käskyjen sijaan säännöistä ja kyselyistä. Kyselyllä pyritään selvittämään, pystytäänkö se johtamaan säännöistä käsin.

Yksinkertaiset faktat ja säännöt
--------------------------------

Yksinkertaisimmillaan prolog-ohjelma koostuu yhdestä faktasta, esimerkiksi

```
 sataa.

```

Ohjelman syöttämisen jälkeen voidaan prolog-tulkille esittää sama lause kyselynä, jolloin prolog vastaa "yes".

Monimutkaisemmat faktat kertovat olioiden ominaisuuksia ja suhteita, esimerkiksi

```
 kaunis(maija).
 kaunis(liisa).
 rikas(matti).
 isa(matti, maija).
 suhteessa(liisa, pekka, avoliitto).

```

Tällöin kyselyssä voidaan käyttää muuttujaa. Muuttuja alkaa prologin syntaksissa isolla alkukirjaimella. Esimerkiksi kysely "kaunis(X)." antaa tulokseksi ensin "maija" ja sitten "liisa"; prologilla siis voidaan hakea kaikki kyselyyn sopivat vastaukset.

Säännön merkkinä on :- -merkkiyhdistelmä. Jos on kurjaa kun sataa ja tuulee, se kerrotaan prologille

```
 kurjaa :- sataa, tuulee.

```

Säännöissä voidaan käyttää muuttujia kuvaamaan haluttuja faktojen yhteyksiä:

```
 vaimoehdokas(X) :- kaunis(X), isa(Y, X), rikas(Y).

```

Näiden ohjelmarivien jälkeen voidaan joko kysyä onko liisa sopiva vaimoehdokas, tai etsiä kaikki sopivat. Kyselyt ovat "vaimoehdokas(liisa)." ja (muuttujan nimellä ei ole tässä merkitystä) "vaimoehdokas(Nimi)".

Rekursiiviset säännöt
---------------------

Prologin edut näkyvät vasta rekursiivisissa ohjelmissa, jossa sääntö määritellään itsensä kautta. Esimerkiksi luonnolliset luvut voidaan määritellä kahdella säännöllä: 1) nolla on luonnollinen luku ja 2) jokaisella luonnollisella luvulla on seuraaja, joka on myös luonnollinen luku. Prologilla tämä sanottaisiin

```
 luku(0).
 luku(s(X)) :- luku(X).

```

Tällöin kysely "luku(X)." antaisi vastauksia "0", "s(0)", "s(s(0))", s(s(s(0)))" jne. rajattomasti.

Vastaavasti esimerkiksi esi-isä on joko isä tai isän esi-isä, siis

```
 esi\_isa(X, Y) :- isa(X, Y).
 esi\_isa(X, Y) :- isa(Z, Y), esi\_isa(X, Z).

```

Tällöin prologin ongelmat toisaalta jo nousevat esiin. Periaatteessa viimeisin sääntö olisi voitu kirjoittaa toisinpäin, siis "esi\_isa(X, Y) :- esi\_isa(X, Z), isa(Z, Y).", mutta prologin suoritusjärjestyksen vuoksi tämä johtaisi ikuiseen silmukkaan kyselyssä.

Käyttö
------

Prologia käytetään muun muassa tekoälysovelluksien tekemiseen. Prolog sai paljon mainetta 1980-luvulla kun se valittiin Japanissa kaavailtujen "viidennen sukupolven tietokoneiden" ohjelmointikieleksi. 

Vuonna 1986 Borland julkaisi Turbo Prologin DOSille. Myöhemmin julkaistiin Visual Prolog.

Katso myös
----------

* Predikaattilogiikka
* Symbolinen logiikka ja Prolog

Lähteet
-------

1. ↑  Programming Languages *University of Waikako, Department of Computer Science*.  2010-4-23.  Arkistoitu 29.6.2011. Viitattu 16.4.2011.
2. ↑  Turbo Prolog 1.x *winworldpc.com*. Viitattu 11.12.2021. (englanniksi)

Kirjallisuutta
--------------

* Patrick Blackburn & Johan Bos & Kristina Striegnitz: *Learn Prolog Now!*. College Publications, 2006. ISBN 1-904987-17-6. Teoksen verkkoversio.  (Arkistoitu – Internet Archive)
* W.F. Clocksin & C.S. Mellish: *Programming in Prolog*. Springer-Verlag, 1984. ISBN 3-540-15011-0.
* Henno, Jaak: *Prolog ja Olympoksen jumalat*. WSOY, 1991. ISBN 951-0-16963-3.
* Laitila, Erkki: *Visual Prolog perusteet*. Teknolit, 1996. ISBN 952-9823-27-4.
* Laitila, Erkki: *Teollisuuden sovellukset: Visual Prolog*. Teknolit, 1996. ISBN 952-9823-51-7.

Aiheesta muualla
----------------

* (Arkistoitu – Internet Archive) Visual Prolog
* SWI-Prolog
	+ Try SWI-Prolog online
* GNU Prolog
* SICStus
* YAProlog
* Ciao Prolog
* Strawberry Prolog
* Logiikkaohjelmointi *Tampereen teknillisen yliopiston sivusto*. Viitattu 2011-10-5. [vanhentunut linkki]

|  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * n
* k
* m
Yleisimmät ohjelmointikielet |
| --- |
|  |
| Tuotantokäytössä | 
* Ada
* APL
* Assembly
* AWK
* C
* C++
* C#
* COBOL
* Dart
* Delphi
* Eiffel
* Erlang
* Forth
* Fortran
* Go
* Java
* JavaScript
* Kotlin
* Lisp
* Lua
* Objective-C
* Pascal
* Perl
* PHP
* PostScript
* Python
* R
* Ruby
* Rust
* Smalltalk
* Swift
* Tcl
* TypeScript
* Visual Basic

 |
|  |
| Akateemiset | 
* CLU
* Haskell
* Logo
* ML
* OCaml
* Prolog
* Scheme

 |
|  |
| Historialliset | 
* ALGOL
* BASIC
* Modula-3
* MUMPS
* Plankalkül
* PL/I
* Simula

 |
|  |
| Luettelo yleisimmistä ohjelmointikielistä |

 |

|  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 

| Auktoriteettitunnisteet Muokkaa Wikidatassa |
| --- |
|  |
| Kansalliset | 
* Ranska
* BnF data
* Israel
* Yhdysvallat

 |
|  |
| Muut | 
* IdRef

 |

 |