Definite Clause Grammar (DCG)

Erinevusnimistute struktuuri selgitades (Lause] = Aluserühm + Verbirühm), ei ole nimistute eneste märkimine tegelikult vajalik, sest siin ei esitata (peale struktuuri ) mingit informatsiooni nimistute kohta. Sellepärast on Prologis olemas formalism Definite Clause Grammars (DCG), mis võimaldab väljendada informatsiooni: Lause on nimistu, mis koosneb alamnimistutest Aluserühm ja (selle järel) Verbirühm (millised kõik on esitatud erinevusnimistutena) kompaktse grammatikareeglina, kus mitteterminalidena on Prologi predikaadid lause, aluserühm, verbirühm:
lause --> aluserühm, verbirühm.
aluserühm --> [koer].
aluserühm --> [lõvi].
verbirühm --> [ulub].
verbirühm --> [möirgab].
Nendes produktsioonides on kõigil mitteterminalidel vaikimisi attribuutidena nimistud, mis erinevusnimistutena moodustavad mitteterminalile vastava nimistu, s.t. esimene ülalesitatud reegel on samaväärne reegliga
lause(L,[]) --> aluserühm(L,V), verbirühm(V,[]).
Kui päringut sooritades tahetakse näha kogu nimistut Lause, tuleb see (taas kahe nimistuna, mis erinevusnimistuna annavad nimistu Lause) päringus näidata:
lause(L,[]).
L = [koer, ulub]
L = [koer, möirgab]

jne.
Produktsioonidele võib lisada tavalisi Prologi attribuute (erinevuslistide nimistud lisab Prolog kaheks viimaseks!); kui mingi predikaat on mõeldud tavaliseks Prologi predikaadiks (mitte produktsiooni mitteterminaliks), võetakse ta figuursulgude {} vahele.
Olgu näiteks tarvis kirjeldada käske, mis esinevad arvutimängudes:

mine tuppa
mine edasi järgmisesse ruumi
vaata lauda
vaata lähemalt kappi
võta võti
võta punane pudel
jne
Sellise käsu esimene osa on verb (üks või mitu sõna) ja sellele järgneb objekt, millele verbi tegevus on sihitud (sihitis). Verbe on kaht tüüpi ja nad nõuavad enda järel erinevaid objekte (sihitisi): "mine"-tüüpi verbi järel peab olema objektina paik ja verbi "võta", "vaata" järel mingi ese; esemed on näiteks kõik, mis võivad asuda kusagil ruumis, s.t. on kirjeldatud predikaadiga asub(Ese, Ruum). Sellise süntaksiga käsud võib kirjeldada näiteks nii:
käsk([V,O]) -->
verb(ObjektiTüüp, V),
objekt(ObjektiTüüp, O). %verbil ja objektil peab olema sama tüüp!
verb(koht, mine) --> [mine].
verb(koht, mine) --> [mine, edasi]. %sõnade nimistu
verb(ese, võta) --> [võta].
verb(ese, vaata) --> [vaata].
verb(ese, vaata) --> [vaata, lähemalt].
objekt(Tüüp, N) --> nimisõna(Tüüp, N).
objekt(Tüüp, N) --> täiend, nimisõna(Tüüp, N).
täiend --> [punane].
nimisõna(koht,X) --> [X], {ruum(X)}.
nimisõna(koht,'ruum') --> [elutuba].
nimisõna(koht,'ruum') --> [köök].
nimisõna(ese,X) --> [X], {asub(X,_)}.% kui X asub kusagil, on X ese!

ruum(tuba).
ruum(esik).
asub(laud,tuba).
asub(riiul,esik).


Ülesandeid:
1. Ylesande tekst


Küsimused, probleemid: ©2004 Jaak Henno