% 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)).