1%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    2%%                                                                           %%
    3%%      Version:  1.00   Date:  7/07/94   File: test.pl                      %%
    4%% Last Version:                          File:                              %%
    5%% Changes:                                                                  %%
    6%%  7/07/94 Created                                                          %%
    7%%                                                                           %%
    8%% Purpose:                                                                  %%
    9%%                                                                           %%
   10%% Author:  gilbert boyreau                                                  %%
   11%%                                                                           %%
   12%%                                                                           %%
   13%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   14
   15/*%^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   16% :- module_interface( upp_unify ).
   17% :- export unify_a1/2.
   18% :- export upp_unify/3.
   19
   20% :- begin_module( upp_unify ).
   21
   22\chapter
   23[Die Datei {\tt tom\_normalize\_unify\_a1}]
   24{Die Datei {\Huge \tt tom\_normalize\_unify\_a1}}
   25
   26This file uses a unification algorithm that is written in C. It has to be
   27named |modal| and has to be in the directory |~/bin|, executable, of course.
   28This code has been written by Gilbert Boyreau, Caen University, France.
   29
   30\PL*/
   31
   32
   33list_to_conjonction( [],true ).
   34list_to_conjonction( [T|Q],','(T,Conj) ) :-
   35	list_to_conjonction( Q,Conj ).
   36
   37/* le predicat d'initialisation */
   38start :-
   39	exec( "modal",[modal_in,modal_out],_ ),
   40	read_string( modal_out,">",_,_ ),
   41	printf( modal_in,"Eclipse\n%b",[] ),
   42%	printf( modal_in,"debug\n%b",[] ),
   43	read_string( modal_out," ",_,_ ).
   44
   45
   46:- start.   47
   48stop:-
   49	printf(modal_in,"quit\n%b",[]).
   50
   51normalize_unify_a1(Pred,Pred1) :- 
   52	normalize_ass(Pred,Pred0),
   53	normalize_ass(Pred1,Pred10),
   54	unify_a1(Pred0,Pred10).
   55
   56
   57
   58/* le predicat de calcul */
   59upp_unify( T1,T2,L_variables,Unifier ) :-
   60	term_variables( T1+T2,L_variables ),
   61	printf( modal_in,"unif\n%QODVw\n%QODV.w\n%QODV.w\n%b",
   62			 [L_variables,T1,T2] ),
   63	read( modal_out,L_variables-L_l_unifiers ),
   64	member( Unifier,L_l_unifiers ).
   65
   66/* les predicats d'interface */
   67upp_unify( T1,T2,Unifier_list ) :-
   68	upp_unify( T1,T2,_,Unifier ),
   69	conjunction_to_list( Unifier,Unifier_list ).
   70
   71unify_a1( T1,T2 ) :-
   72	upp_unify( T1,T2,_,Unifier ),
   73	call( Unifier ).
Master File: unify_a1.tex
   81:- set_flag(occur_check,on).   82/*PL%^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   83
   84\Predicate normalize_ass/(+Term, ?Normal).
   85
   86Bring a $associative\_binary\_functor$ term into normal form by eliminating
   87superfluous $associative\_neutral\_element$ and flattening
   88$associative\_binary\_functor$ terms.
   89
   90\PL*/
   91
   92normalize_ass(Var,Var2) :-
   93	var(Var),
   94	!,
   95	Var = Var2.
   96normalize_ass(Atom,Atom2) :-
   97	atomic(Atom),
   98	!,
   99	Atom = Atom2.
  100normalize_ass(+(A1,Arg),
  101	      NormalArg) :-
  102	A1 == 0,
  103	!,
  104	normalize_ass(Arg,NormalArg).
  105normalize_ass(+(Arg,A2),
  106	      NormalArg) :-
  107	A2 == 0,
  108	!,
  109	normalize_ass(Arg,NormalArg).
  110normalize_ass(+(A1,C),
  111	      Normal) :-
  112	nonvar(A1),
  113	A1 = +(A,B),
  114	!,
  115	normalize_ass(+(A,
  116					+(B,C)),
  117					Normal).
  118normalize_ass(+(A,B),
  119	      +(NormalA,NormalB)) :-
  120	!,
  121	normalize_ass(A,NormalA),
  122	normalize_ass(B,NormalB).
  123normalize_ass(Term,NormalTerm) :-
  124	Term =.. [F|Args],
  125	normalize_ass_list(Args,NormalArgs),
  126	NormalTerm =.. [F|NormalArgs].
  127
  128normalize_ass_list([],[]).
  129normalize_ass_list([H|T],[NormalH|NormalT]) :-
  130	!,
  131	normalize_ass(H,NormalH),
  132	normalize_ass_list(T,NormalT).
  133
  134analyse([],[]).
  135analyse([_+I|Rest],[I|Indices]) :- 
  136	analyse(Rest,Indices).
  137
  138/*PL%^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  139
  140\EndProlog */