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

:- dynamic(szo/1).
:- dynamic(pref/3).  
% pref(P,S,N): S egy N hosszu string,
% melyet P utan irva az eredeti szoveget kapjuk


:- use_module(library(lists)).

:- write('Hasznalat:'), nl.
:- write('   szavak beolvasasa:'), nl.
:- write('   ?- beolvas.'), nl.
:- write('   maximalis prefix megkeresese:'), nl.
:- write('   ?- max_pref(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 -------------------------------------


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

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


max_pref(Szoveg,_):-
          atom_codes(Szoveg,SzovegKod),
          length(SzovegKod,N),
          assertz(pref([],SzovegKod,N)),
          jobbra_lep(N).
max_pref(_,MaxPref):-
          setof((N,Pref),Suff^pref(Pref,Suff,N),[(_,MaxPrefKod)|_]),
          atom_codes(MaxPref,MaxPrefKod),
          retract(pref(_,_,_)).
      
jobbra_lep(N):-
          pref(Prefix,Suffix,N),
          !,
          toldas(Prefix,Suffix),
          N1 is N-1,
          jobbra_lep(N1).
jobbra_lep(N):- N>0, N1 is N-1, jobbra_lep(N1).

toldas(Prefix,Suffix):-
          szo(Szo),
          minus(Suffix,Szo,UjSuffix),
          length(UjSuffix,UjN),
          \+pref(_,_,UjN),
          append(Prefix,Szo,UjPrefix),
          assertz(pref(UjPrefix,UjSuffix,UjN)),
          fail.
toldas(_,_).