De la même manière, en reprenant le même lexique, l'analyseur lexical se réduit au prédicat suivant :
lex(lex(MOT,MOT,CAT))-->[MOT],{categorie(MOT,CAT)}.
Le symbôle lex
possède trois arguments : le morceau de phrase structuré reconnu,
l'expression en lambda-calcul et la catégorie correspondantes.
Les règles s'écrivent alors :
lex([F,A],VSF@VSA,X):=lex(F,VSF,X/Y),lex(A,VSA,Y). lex([A,F],VSF@VSA,X):=lex(A,VSA,Y),lex(F,VSF,X\Y).
lex([F,G],V#VSF@(VSG@V),X/Z):=lex(F,VSF,X/Y),lex(G,VSG,Y/Z). lex([G,F],V#VSF@(VSG@V),X\Z):=lex(G,VSG,Y\Z),lex(F,VSF,X\Y).
lex(F,V#W#VSF@W@V,(X/Y)\Z):=lex(F,VSF,(X\Z)/Y). lex(F,V#W#VSF@W@V,(X\Z)/Y):=lex(F,VSF,(X/Y)\Z).
lex(A,V#V@VSA,Y/(Y\X)),lex(B,VSB,Y\X):=lex(A,VSA,X),lex(B,VSB,Y\X). lex(B,VSB,Y/X),lex(A,V#V@VSA,Y\(Y/X)):=lex(B,VSB,Y/X),lex(A,VSA,X).
lex(F,V#W#VSF@(V@W),(X/Z)/(Y/Z)),lex(G,VSG,Y/Z):= lex(F,VSF,X/Y),lex(G,VSG,Y/Z). lex(G,VSG,Y\Z),lex(F,V#W#VSF@(V@W),(X\Z)\(Y\Z)):= lex(G,VSG,Y\Z),lex(F,VSF,X\Y).
lex(G,VSG,Z/X),lex(F,V#W#V@(VSF@W),(Z/Y)\(Z/X)):= lex(G,VSG,Z/X),lex(F,VSF,X/Y). lex(F,V#W#V@(VSF@W),(Z\Y)/(Z\X)),lex(G,VSG,Z\X):= lex(F,VSF,X\Y),lex(G,VSG,Z\X).
lex(T,VST,Z/Y),lex(B,VSB,Y),lex(A,VSA,X):= lex(T,VST,Z/Y),lex(A,VSA,X),lex(B,VSB,Y). lex(B,VSB,Y),lex(A,VSA,X),lex(T,VST,Z\X):= lex(A,VSA,X),lex(B,VSB,Y),lex(T,VST,Z\X).
lex([A,B],contraction(VSA,VSB),X):=lex(A,VSA,X),lex(B,VSB,X).
Le prédicat d'analyse est :
analyser(PH,VS_S):- parse(lex(NPH,VS,p),PH), writef("%t <=> \n\t%t\n",[NPH,VS]), simplifier(VS,VS_S), writef("\t%t\n",[VS_S]).