%% Description: For the printing a feature structure matix %% %% Writer: Christopf Rumpf (1992) %% %% Name: avm.pl %% avm(AVM) :- fsmat(AVM). % 1 Ç× ¼ú¾î fsmat/1À» avm/1·Î ÀçÁ¤ÀÇ fsmat(FSM) :- abolish(varcnt/1),ana_fsm(FSM,AFSM),nl, print_fsm(AFSM),!. ana_fsm([],fsm([],0,0)) :- !. ana_fsm([(A:V)|T], fsm([fs(attr(A,AL),Val)|T1],L,H)) :- string_length(A,AL), ana_val(V,Val), ana_fsm(T,fsm(T1,L1,H1)), fsm_size(AL,Val,L1,H1,L,H),!. ana_val(V,aval(V,L)) :- var(V),!, create_var_name(V,L). ana_val(V,aval(V,L)) :- atomic(V),!,string_length(V,L). ana_val(V,fsm(FSM,L,H)) :- ana_fsm(V,fsm(FSM,L,H)). fsm_size(AL,aval(V,VL),L2,H2,L,H) :- H is 1+H2, max(AL+VL+3,L2,L). fsm_size(AL,fsm(V,L1,H1),L2,H2,L,H) :- H is H1+H2, max(AL+L1+3+4,L2,L). print_fsm(fsm([],0,0)) :- !, tab(2), w([[],nl]). print_fsm(fsm(FSM,L,1)) :- !, tab(2), w([' [ ']), print_fsm1([(2,1,1)], _,[],fsm(FSM,L,1)). print_fsm(fsm(FSM,L,H)) :- !, tab(2), w(['¦®']), print_fsm1([(2,H,H)], _,[],fsm(FSM,L,H)),!. print_fsm(FSM) :- nl, write('error printing feature structure matrix:'),nl, write(FSM),nl. print_fs(LB,LB1,RB,fs(attr(A,AL),aval(V,VL)),L,H):- !, w([A,' : ',V]), RB1 is L-(AL+VL+3), right([RB1|RB],LB,LB1). print_fs(LB,LB1,RB,fs(attr(A,AL),fsm(FSM,L1,1)),L,H):- !, w([A,' : ',' [ ']), RB1 is L-(L1+AL+7), print_fsm1([(AL+3,1,1)|LB],LB1,[RB1|RB],fsm(FSM,L1,1)). print_fs(LB,LB1,RB,fs(attr(A,AL),fsm(FSM,L1,H1)),L,H):- !, w([A,' : ','¦®']), RB1 is L-(L1+AL+7), print_fsm1([(AL+3,H1,H1)|LB],LB1,[RB1|RB],fsm(FSM,L1,H1)). print_fsm(LB,LB,RB,fsm([],_,_)) :- !. print_fsm(LB,LB2,RB,fsm([FS|FSs],L,H)) :- left(LB), print_fs(LB,LB1,RB,FS,L,H), print_fsm(LB1,LB2,RB,fsm(FSs,L,H)). print_fsm1(LB,LB2,RB,fsm([FS|FSs],L,H)) :- print_fs(LB,LB1,RB,FS,L,H), print_fsm(LB1,LB2,RB,fsm(FSs,L,H)). left([]):- !. left([(T,1,_)|R]) :- !, left(R), tabs(T), write('¦±'). % last line left([(T,H,_)|R]) :- left(R), tabs(T), write('¦­'). % inner line right([],[],[]) :- nl,!. right([RT|R1],[(LT,1,1)|R2],R3) :-!, tabs(RT), write(' ] '), right(R1,R2,R3). right([RT|R1],[(LT,1,H)|R2],R3) :-!, tabs(RT), write('¦°'), right(R1,R2,R3). right([RT|R1],[(LT,H,H)|R2],[(LT,H1,H)|R3]) :-!, tabs(RT), write('¦¯'), dec(H,H1), right(R1,R2,R3). right([RT|R1],[(LT,LH,H)|R2],[(LT,LH1,H)|R3]) :-!, tabs(RT), write('¦­'), dec(LH,LH1), right(R1,R2,R3). w([]) :- !. w([Var|T]) :- var(Var),!,write(Var). w([nl|T]) :- !,nl,w(T). w([H|T]) :- write(H),w(T). tabs(X) :- T is X, tab(T). create_var_name(V,Length) :- get_var_count(Count,Length), name(V,[35|Count]),!. get_var_count(Count,Length) :- var_counter(C), name(C,Count), length(Count,L), Length is L+1. var_counter(C) :- retract(varcnt(C)), inc(C,C1), assert(varcnt(C1)). var_counter(1) :- assert(varcnt(2)). max(X,Y,X) :- X >= Y,!. max(X,Y,Y) :- X < Y. dec(X,X1) :- X1 is X-1. /* % To Test test1 :- avm([cat:s,agr:[num:sg,per:3|_],pred:[phon:love,cat:verb|_]|_]). test2 :- avm([cat:s,agr:[num:sg,per:3|_],pred:[phon:love,cat:verb,subcat:[subj:mimi,obj:nana|_]|_]|_]). ?- test1. ¦®cat : s ¦¯ ¦­agr : ¦®num : sg¦¯ ¦­ ¦­ ¦±per : 3 ¦° ¦­ ¦­pred : ¦®phon : love¦¯¦­ ¦± ¦±cat : verb ¦°¦° Yes ?- test2. ¦®cat : s ¦¯ ¦­agr : ¦®num : sg¦¯ ¦­ ¦­ ¦±per : 3 ¦° ¦­ ¦­pred : ¦®phon : love ¦¯¦­ ¦­ ¦­cat : verb ¦­¦­ ¦­ ¦­subcat : ¦®subj : mimi¦¯¦­¦­ ¦± ¦± ¦±obj : nana ¦°¦°¦° Yes */