/*****************************************************************************/ /* */ /* 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).