% 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(_,_).