next up previous contents
Next: Implémentation du simulateur de Up: Sources de la grammaire Previous: Sources de la grammaire

Sources du module de logique


/*****************************************************************************/
/*                                                                           */
/* Christophe DELORD                                                         */
/*                                                                           */
/* Stage 1997/98 : ENSEEIHT - Traitement du langage naturel                  */
/*                                                                           */
/*****************************************************************************/

/*****************************************************************************/
/*                                                                           */
/* Logique intensionnelle et lambda calcul                                   */
/*                                                                           */
/*****************************************************************************/

:-module(log_int,
    [
        simplifier/2
    ]
).

/*  Syntaxe utilisée pour la représentation des formules
 *
 *      MN          M @ N
 *      lX.f        X # f           X doit etre une variable prolog
 *      lZ.Z(a,b)   Z # Z@a@b
 *      not X       ! X
 *      X and Y
 *      X or Y
 *      X => Y      (implication)
 *      X <=> Y     (équivalance)
 *      pour tout X : P     all(X,P)
 *      il existe X : P     exists(X,P)
 *
 */

% Les priorités sont entre 900 et 950

:-op(900,fy,not).       % C'est la définition de ProLog
:-op(910,yfx,@).        % application @ plus prioritaire que lambda #
:-op(915,xfy,#).
:-op(920,yfx,and).
:-op(930,yfx,or).
:-op(945,xfy,=>).
:-op(950,xfy,<=>).

simplifier(X,X):-
    var(X),
    !.

simplifier(X@N,X@NS):-
    var(X),
    !,
    simplifier(N,NS).

simplifier((X#F)@X,FS):-
    !,
    simplifier(F,FS).

simplifier(M@N,S):-
    simplifier(M,MS),
    MS\=M,
    !,
    simplifier(MS@N,S).

simplifier(M@N,S):-
    simplifier(N,NS),
    NS\=N,
    !,
    simplifier(M@NS,S).

simplifier(M@N,S):-
    M=..[F|ARGS],
    F\='@', F\='#',                     % cas : (Z@x)@y, ...
    F\='and', F\='or', F\='=>', F\='<=>',
    F\='all', F\='exists',
    F\='int', F\='ext',
    !,
    append(ARGS,[N],NEW_ARGS),
    S=..[F|NEW_ARGS].   % inutile de simplifier S

simplifier(ext(X),ext(X)):-
    var(X),
    !.

simplifier(ext(int(Z)),Z_S):-
    !,
    simplifier(Z,Z_S).

simplifier(T,TS):-
    T=..[FUNC|ARGS],
    simplifier_liste(ARGS,ARGS_S),
    TS=..[FUNC|ARGS_S].

simplifier_liste([],[]).
simplifier_liste([ARG|ARGS],[ARG_S|ARGS_S]):-
    simplifier(ARG,ARG_S),
    simplifier_liste(ARGS,ARGS_S).



Christophe Delord
1998-09-02