A Prolog típustalan nyelv, azonban egy adott paraméter-pozíción értelmes, olyan Prolog kifejezések (amelyekben nem szerepel (behelyettesítetlen) változó) halmazát nevezhetjük típusnak.
A Prologban általában nincs típushiba, csak meghiúsulás, azonban hibajelzést kaphatunk akkor, ha egy beépített eljárást nem megfelelő típusú paraméterrel hívunk. Így a típus implicit módon jelenik csak meg: adatábrázolási döntésünk csak az adatokat felhasználó eljárások alakjában tükröződik.
Tulajdonképpen a Prologban csak két (a hagyományos értelemben vett) elemi típus van, az egész (Integer) és a lebegőpontos (Float). Természetesen - mivel logikai nyelv - implicit módon a logikai típus (Boolean) is "definiált". Ismert továbbá a sztring-típus is. Újabb típusok készítésére az összetett termek (COMPOUND TERM) állnak rendelkezésünkre:
Csakúgy mint más programozási nyelvekben a Prologban is a listát bizonyos objektumok véges sorozatának ábrázolására használjuk.
Érdekesség, hogy a lista elemeinek nem kell azonos típusúnak lenniük (ez persze az eddigiek alapján igazán nem meglepő). Tehát listát szögletes zárójelek között deklarálhatunk, vesszővel elválasztva az elemeit. Ezen felül még hivatkozhatunk egy listára a következőképpen is:
Az első esetben a listára a fejével és a "maradék rész"-ével hivatkoztunk, a második esetben pedig kikötjük, hogy a listának legyen legalább két eleme. Az üres listára is van egy jelölés, ami többek között egy atom is:
Összhangban az eddigiekkel a listák is tulajdonképpen termek, amelyek speciális szintaxissal bírnak. A [H|T] lista azonos a .(H,T) struktúrával.
Vannak valódi, ill. részleges listák. Egy valódi lista lehet üres, vagy nem üres, a nem üres valódi listákat a ’.’/2 függvényszimbólum segítségével építjük fel, kiindulva a [] üres listából. Egy [X|Xs] term pontosan akkor valódi lista, ha Xs valódi lista. Például az [1,2,3] listát a következő alakban írhatjuk fel: .(1,.(2,.(3,[]))) Egy term akkor részleges lista, ha szabad változó, vagy [X|Xs] alakú, ahol Xs részleges lista. Azaz egy term akkor részleges lista, ha nem valódi lista, de megfelelő változóhelyettesítéssel azzá tehető. Tegyük fel például, hogy Xs szabad változó. Ekkor Xs és [1,2|Xs] részleges listák, viszont az [Xs] és [1,2,Xs] valódi listák.
A második klóz arról az esetről szól, amikor az első lista nem-üres: tekintsük az első lista farkát (Xs) és ezt fűzzük össze rekurzívan a második listával, ennek eredményét jelöljük Zs-es. Ez utóbbi elé helyezve az első lista fejét ([X|Zs]) kapjuk az eredményt.
A rekord-deklaráció formája rekordnév(tag1, tag2, ... tagN). Például egy bináris fát megadhatunk az alábbi formában:
Általában azt mondják, a Prolog típustalan nyelv. Ennek ellenére az eljárások csak bizonyos adathalmazokon képesek dolgozni, így implicit módon ugyan, de megjelenik a típusfogalom. Ezt érdemes feltüntetni valamilyen formában. Ez egyrészt elősegíti egy Prolog program működésének jobb megértését, másrészt bizonyos Prolog kiterjesztések használnak típusokat, ezért érdemes megismerkedni velük.
Típusleírásnak tömör Prolog kifejezések egy halmazának megadását értjük(egy Prolog kifejezést tömörnek nevezünk, ha nem tartalmaz változót). A típusleírás, nevéhez hűen, egy típust definiál. Alaptípusok leírására használhatjuk az integer, float, number, atom, atomic és any konstansokat. Az első öt típusnév a megfelelő konstanshalmazt jelöli, az any típusnév pedig az összes Prolog kifejezés halmazát. Az alaptípusokból kiindulva definiálhatunk összetett típusokat. Ehhez meg kell adnunk egy struktúranevet, valamint minden argumentumáról meg kell mondanunk, hogy milyen típusú. A struktúranevet és az argumentumok típusait megadó kifejezést kapcsos zárójelbe téve kapunk egy összetett típust leíró kifejezést. Például a {személy(atom,atom,integer)} kifejezés egy típust definiál. Nevezetesen minden olyan Prolog kifejezés, melynek funktora személy/3, első két argumentuma atom és a harmadik egész szám, ilyen típusú. Ezt precízebben és általánosabban úgy írhatjuk le, hogy a { valami(T1, ..., Tn) } halmazkifejezés ekvivalens a { valami(e1, ..., en) | e1 eleme T1, … , en eleme Tn }, n >= 0 kifejezéssel, azaz a halmaz minden olyan valami nevű struktúrát tartalmaz, amelynek argumentumai render T1 , T2 , stb. típusúak.
Egy típust képezhetünk halmazok uniójaként a \/ operator felhasználásával. Például helyes típusdefiníció az alábbi:
{személy(atom,atom,integer) } \/ { atom-atom } \/ atomAzaz például az alma-alma Prolog kifejezés ilyen típusú, de a személy('Nagy','Béla',24) is.
Azért, hogy hivatkozni tudjunk a típusra el kell neveznünk azt. Ezt az alábbi módon tehetjük meg (Prolog megjegyzésként):
Lássunk is rögtön két példát! Vegyük észre, hogy a második típust rekurzív módon írtuk fel, a típusleírás hivatkozik ugyanis a típusnévre:
Az eddig látott példákban a típusleírásban mindig csak az atom típusnév szerepelt a {} zárójelpáron kívül. Ez nem szükségszerű, tetszőleges típusnév szerepelhet így, olyan is, amelyet mi definiáltunk. Ennek megfelelően az alábbi két (végtelenül egyszerű) példa mindegyike helyes.
A két típus nem egyenlő. Az új_típus1 típus pontosan ugyanazt a halmazt jelöli, mint az ember típus, új_típus2 azonban az egyetlen ember névkonstanst tartalmazó halmazt. (Esetünkben új_típus2 valódi részhalmaza új_típus1-nek.
Egy megkülönböztetett unió csupa különböző funktorú összetett típus uniója. Fontos, hogy nem a struktúranévnek, hanem a funktornak kell különböznie. Azaz nyugodtan lehet két azonos struktúranevű, de különböző argumentumszámú típus. Megkülönböztetett uniót jelölhetünk a szokásos
helyett így is:
Fontos, hogy a megkülönböztetett unió is típus, csak éppen speciális. Két példa megkülönböztetett unióra:
Az előzőekben láttuk, hogy hogyan definiálhatunk saját típust. Legutolsó példaként megadtunk egy olyan listát, amely egészeket tartalmaz. Jó lenne, ha megadhatnánk egy lista-mintát is, azaz egy olyan típust, amely tetszőleges (de egyforma) típusú elemek listája lehet. Ugyanígy, bár tudunk definiálni olyan típust, amelyet az atom-atom alakú struktúrák határoznak meg, szükségünk lehet egy olyan típusra, amelyet tetszőleges típusú elemek párjai alkotnak. Erre szolgálnak az ún. Parameters típusok és erre láthatunk példát az alábbiakban.
(1) T típusú elemekből álló listákat foglal magába, (2) minden olyan '-' nevű kétargumentumú struktúrát, amelynek első argumentuma T1, második T2 típusú. (3) egy olyan típust definiál, amelybe KeyT és ValueT típusú párokból álló listák tartoznak. Végül (4) egy olyan,szótár nevű, típust határoz meg, amelybe ( (5) alapján) atomokból képzett párokból álló listák tartoznak. Ha belegondolunk, ez tényleg felfogható úgy, mint egy szótár.
A típusdeklarációk formális szintaxisa:
típusdeklaráció ::= típuselnevezés | típuskonstrukcióEgy predikátumtípus-deklaráció leírja, hogy egy predikátum milyen típusú adatokat képes fogadni, illetve visszaadni az egyes argumentumaiban. Egy ilyen deklaráció általánosan a következőképpen néz ki:
Lássunk néhány példát az elmondottakra! Az első esetben a member/2 eljárásról jelentjük ki, hogy első argumentuma T típusú, míg a második T típusú elmeket tartalmazó lista. Másodikként az append/3 eljárást írjuk le hasonló módon.
Nyilvánvaló, hogy egy predikátumtípus-deklarációban használhatóak ez előzetesen megadott típusleírások. Eljárásokkal kapcsolatban van még egy fontos fogalom, amit predikátummód-deklarációnak hívunk. Egy ilyen deklaráció leírja, hogy az egyes argumentumok kimenő vagy bemenő módban használatosak. Egy eljáráshoz több ilyen móddeklaráció is megadható annak megfelelően, hogy az eljárás milyen különböző módokban képes működni:
A predikátummód-deklaráció általános felépítése a következő:
:- mode eljárásnév( módazonosító, … )ahol
módazonosító ::= in | out.Arra is van lehetőség, hogy egyetlen deklarációba fogjuk össze a típus- és móddeklarációt is, például:
Ilyen esetben az általános alak:
:- pred eljárásnév( típusazonosító::módazonosító, … )
A SICStus kézikönyv a fentiektől eltérő jelölést használ a bemenő/kimenő argumentumok jelzésére. Az append/3 esetén például:
Az első jelöli az ellenőrzésre és két lista összefűzésére is alkalmas megvalósítást, míg a második a szétszedésre is használhatót. Ennek megfelelően a +, - és ? jelentése:
+ bemenő argumentum
- kimenő argumentum
? tetszőleges argumentum