% am reprezentat un nod ca o pereche între caracter și lista de noduri % copii; rădăcina are literalul gol pe prima poziție % am reprezentat un cuvânt ca o listă de literali emptyTrie(('', [])). % vezi mai multe comentarii în implementarea în Haskell % varianta A canBeFollowedBy(Letter, (_, Children)) :- findall(Char, member((Char, _), Children), Chars), member(Letter, Chars). getSubtreeFor(Letter, (_, Children), Child) :- member(Child, Children), Child = (Letter, _). addWord([], Node, Node). addWord([C|Word], Node, Result) :- canBeFollowedBy(C, Node), !, Node = (NodeChar, Children), findall(Child, (member(Child, Children), Child = (A, _), A \= C), List1), getSubtreeFor(C, Node, Selected), addWord(Word, Selected, SelectedResult), List = [SelectedResult | List1], Result = (NodeChar, List). addWord([C|Word], (Char, Children), Result) :- addWord(Word, (C, []), NewNode), Result = (Char, [NewNode|Children]). % varianta B countWords((_, []), 1) :- !. countWords((_, Children), Count) :- findall(C, (member(Child, Children), countWords(Child, C)), Counts), sum_list(Counts, Count). printWords(('', Children), Result) :- !, findall(Print, (member(Child, Children), printWords(Child, Print)), Prints), append(Prints, Result). printWords((Char, []), [[Char]]) :- !. printWords((Char, Children), Result) :- findall(Print, (member(Child, Children), printWords(Child, Print)), Prints), append(Prints, OneList), findall(Word, (member(W, OneList), Word = [Char|W]), Result). predict([], Node, Result) :- !, printWords(Node, Result). predict(Prefix, ('', Children), Result) :- !, member(Child, Children), predict(Prefix, Child, Result). predict([Char|Rest], (Char, Children), Result) :- findall(Res, ( member(Child, Children), predict(Rest, Child, Predictions), findall(Word, (member(W, Predictions), Word = [Char|W]), Res) ), Results), append(Results, Result). % altele addWords([], Trie) :- emptyTrie(Trie). addWords([Word|Words], Trie) :- addWords(Words, Trie1), addWord(Word, Trie1, Trie). % addWords([[m,i,c,a], [m,i,n,a], [m,a,m,a], [m,e,l,c], [m,i,c,i]], % Trie),