/* BUG final version
This version of the implementation serves mainly as
documentation - probably faster implementations are
possible
*/
bug(FS,String):-
sem(FS,Sem),
copy_term(Sem,Sem2),
numbervars(Sem,0,_), %coherent
generate(FS,Shad,P0-[]),
phonology(P0,String),
sem(Shad,ShadSem),
subsume(Sem2,ShadSem). %complete
generate(FS,Shad,Mother,[FS|T]-T):-
sem(FS,Sem),
not not sem(Mother,Sem), !, %syntactic head
word(Word,FS,Shad).
generate(FS,Shad,Mother,P0-PN):-
link(FS,Down),
word(Word,Down,Shad2),
up(Down,FS,Shad2,Shad,[Word|PI]-PJ,P0-PN).
up(X,X,Shad,Shad,P0-PN,P0-PN).
up(Down,Top,DownShad,TopShad,PI-PJ,P0-PN):-
rule(Down,Mother,Lefts,Rights,
DownShad,MotherShad,LeftsShad,RightsShad),
link(Top,Mother),
generate_list(Lefts,LeftsShad,Mother,PH-PI),
generate_list(Rights,RightsShad,Mother,PJ-PK),
up(Mother,Top,MotherShad,TopShad,PH-PK,P0-PN).
generate_list([],[],_,P0-P0).
generate_list([H|T],[HShad|TShad],Mother,P0-PN):-
generate(H,HShad,Mother,P0-P1),
generate_list(T,TShad,Mother,P1-PN).