% A program beolvassa a szavak.pl file-bol az abban talalhato szavakat,
% es a maxprefix(Szoveg,Prefix) utasitasra megkeresi a
% a file-beli szavakbol osszeallithato leghosszabb prefixet Szovegnek.

:- dynamic(pref/2).
:-
dynamic(szo/1).

:- use_module(library(lists)).

:- write('Hasznalat:'), nl.
:- write('   szavak beolvasasa:'), nl.
:- write('   ?- beolvas.'), nl.
:- write('   maximalis prefix megkeresese:'), nl.
:- write('   ?- maxprefix(Szoveg,Prefix).'), nl.


%------------------------------- beolvasas -------------------------------------

beolvas:- see('szavak.pl'),
          repeat,
             read(Adat),
             feldolg(Adat),
             Adat==end_of_file,
          !,
          seen.

feldolg(end_of_file):- !.
feldolg(szo(Szo)):- atom_codes(Szo,SzoKod), assertz(szo(SzoKod)).



%------------------------------- generalas -------------------------------------


maxprefix(Szoveg,_):- atom_codes(Szoveg,SzovegKod),prefix_keres(SzovegKod,[]).
maxprefix(_,Prefix):-
          pref(_,PrefixKod),
          retractall(pref(_,_)),
          atom_codes(Prefix,PrefixKod).

prefix_keres(Szoveg,Prefix):-
          szo(Szo),
          minus(Szoveg,Szo,Maradek),
          append(Prefix,Szo,Ujprefix),
          update(Ujprefix),
          prefix_keres(Maradek,Ujprefix).


% minus(Mibol,Mit,Maradek)   : a Mibol lista elejerol eltunteti a Mit listat

minus
(Mibol,Mit,Maradek):- append(Mit,Maradek,Mibol).


% update: megvizsgalja, hogy az argumentumaban levo prefix hosszabb-e, mint
% az eddigi leghosszabb (amit pref/2-vel tarolunk), es ha igen, kicsereli azt.

update(Prefix):-
          pref(K,_),
          !,
          length(Prefix,Hossz),
          Hossz>K,
          retract(pref(_,_)),
          assertz(pref(Hossz,Prefix)).
update(Prefix):- length(Prefix,Hossz), assertz(pref(Hossz,Prefix)).