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).
verb(koht, mine) --> [mine].
verb(koht, mine) --> [mine, edasi].
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,_)}.
ruum(tuba).
ruum(esik).
asub(laud,tuba).
asub(riiul,esik).
Ülesandeid:
1.
Ylesande tekst
Küsimused, probleemid:
©2004
Jaak Henno