Jak naučit počítač rozumět lidské řeči? To je svatý grál umělé inteligence. Siri, Alexa nebo Google Translate musí umět rozložit větu na kousky, pochopit, co je podmět, co přísudek a jak to spolu souvisí. Prolog je pro tento úkol jako stvořený. Má v sobě zabudovaný nástroj pro definování gramatiky, který funguje jako pravidla pro skládání LEGO kostiček.
Prolog používá speciální zápis zvaný DCG (Definite Clause Grammar). Místo :- používáme šipku -->. Ta říká: "Tohle se skládá z tamtoho."
Příklad věty: "Kočka loví myš."
% Gramatická pravidla
veta --> podmetna_cast, prisudkova_cast.
podmetna_cast --> clen, podstatne_jmeno.
prisudkova_cast --> sloveso, podmetna_cast.
% Slovník (Terminály)
clen --> [ta].
clen --> [tu].
podstatne_jmeno --> [kocka].
podstatne_jmeno --> [mys].
sloveso --> [lovi].
K práci s gramatikou používáme vestavěný predikát phrase(Gramatika, Veta).
1. Analýza (Parsing): Je to správná věta?
?- phrase(veta, [ta, kocka, lovi, tu, mys]).
true.
?- phrase(veta, [kocka, ta, lovi]).
false.
2. Generování: Vymysli větu!
Tohle je ta největší magie. Můžeme nechat proměnnou prázdnou a Prolog vygeneruje všechny platné věty, které podle naší gramatiky existují.
?- phrase(veta, X).
X = [ta, kocka, lovi, ta, kocka] ;
X = [ta, kocka, lovi, ta, mys] ;
X = [ta, kocka, lovi, tu, kocka] ...
Čeština je složitá. Nemůžeme říct "Kočky loví" (množné číslo) a "Kočka loví" (jednotné číslo) se stejným slovesem, pokud se tvar liší. Prolog umí hlídat gramatickou shodu pomocí argumentů v gramatice.
% Přidáme argument 'Cislo' (jednotne/mnozne)
veta(Cislo) --> podmetna_cast(Cislo), prisudkova_cast(Cislo).
podmetna_cast(jednotne) --> [kocka].
podmetna_cast(mnozne) --> [kocky].
prisudkova_cast(jednotne) --> [lovi]. % Kočka loví
prisudkova_cast(mnozne) --> [lovi]. % Kočky loví (zde je to stejné, ale...)
prisudkova_cast(jednotne) --> [spi]. % Kočka spí
prisudkova_cast(mnozne) --> [spi]. % Kočky spí (krátké i)
Díky unifikaci proměnné Cislo Prolog zajistí, že pokud vybereme podmět v jednotném čísle, musí být i přísudek v jednotném čísle.
V Prologu gramatika neslouží jen k kontrole (rozumím tomu?), ale i k tvorbě (řekni něco!). Stejný kód funguje oběma směry. To je v jiných jazycích velmi obtížné naprogramovat.
[kocka])? (Protože DCG pracuje se seznamy slov).phrase(veta, X) a nechte Prolog vygenerovat 5 různých vět. Zkuste přidat přídavná jména (hodný, zlý) a sledujte, jaké "příběhy" vzniknou.