2-Prolog et sémantique structurelle : (5 points)
:- op(900 , xfx , '<->'). :- op(900 , xfx , '<-'). :- op(600 , xfy , v). :- op(300 , xfy , &). complete2Prolog(P '<->' D , LS) :- impl2Prolog(P , D , LS). impl2Prolog(P , C v D1, LS) :- impl2Prolog(P , C , LS1), impl2Prolog(P , D1, LS2), append(LS1 , LS2 , LS). impl2Prolog(P , C , [P :- Q]) :- conj2Prolog(C , Q). conj2Prolog(P & true , P) :- !. conj2Prolog(true & C , Q) :- conj2Prolog(C , Q). conj2Prolog(P & C , (P,Q)) :- conj2Prolog(C , Q). conj2Prolog(P , P) :- member(P , [p,q,r,s,t , false]).
3-DCG : (6 points)
/* * construction de l'AST selon la syntaxe abstraite ci dessus */ fcompl(equiv(P , D)) --> prop(P) , ['<->'] , disj(D). disj(D) --> conj(D). disj(ou(C , D)) --> conj(C) , [v] , disj(D). conj(P) --> prop(P) . conj(true) --> [true] . conj(false) --> [false] . conj(et(P , C)) --> prop(P) , [&] , conj(C). conj(et(true , C)) --> [true] , [&] , conj(C). conj(et(false , C)) --> [false] , [&] , conj(C). prop(X) --> [X] , {member(X , [p,q,r,s,t])}. %exemple de but : ?- fcompl(AST , [p,'<->',q,&,r,&,s, v, t,&,q, v, r] , []) , fcomplete2Prolog(AST , L). AST = equiv(p, ou(et(q, et(r, s)), ou(et(t, q), r))) L = [ (p:-q, r, s), (p:-t, q), (p:-r)] avec le programme précédent modifié... fcomplete2Prolog(equiv(P , D) , L) :- implInv2Prolog(P , D , L). implInv2Prolog(P , ou(C , D), L) :- implInv2Prolog(P , C , L1), implInv2Prolog(P , D , L2), append(L1 , L2 , L). implInv2Prolog(P , C , [P :- Q]) :- conjonc2Prolog(C , Q). conjonc2Prolog(et(P , true) , P) :- !. conjonc2Prolog(et(true , C) , Q) :- conjonc2Prolog(C , Q). conjonc2Prolog(et(P , C) , (P,Q)) :- conjonc2Prolog(C , Q). conjonc2Prolog(P , P) :- member(P , [p,q,r,s,t , false]).
4-Java : (5 points)
//public class Fcompl{ private Prop p; private Disj d; public Fcompl(Prop tete,Disj alter){ p=tete; d=alter; } public String getTete(){ return p.getNom(); } public String toString(){ return p.getNom() + " <-> " + d.toString(); } public String toProlog(){ //règle sémantique structurelle rf return new Impl(p,d).toProlog(); } } //public class Impl{ private Prop p; private Disj d; public Impl(Prop tete,Disj alter){ p=tete; d=alter; } public String getTete(){ return p.getNom(); } public String toString(){ return p.getNom() + " <- " + d.toString(); } public String toProlog(){ if (d instanceof Ou){ // règle sémantique rd1 return new Impl( p , ((Ou)d).c).toProlog() + new Impl( p , ((Ou)d).d).toProlog(); } if (d instanceof Conj){ // règle sémantique rd2 return p.getNom()+ " :- " + d.toProlog()+ ".\n"; } return "erreur de syntaxe..."; } } //public abstract class Disj{ public abstract String toString(); public abstract String toProlog(); } //public class Ou extends Disj{ public Conj c; public Disj d; public Ou(Conj mg , Disj md){ c = mg; d = md; } public String toString(){ return c.toString() + " v " + d.toString(); } public String toProlog(){ return ""; } } //public abstract class Conj extends Disj { } //public class Prop extends Conj{ private String nom; public Prop(String n){ nom=n; } public String getNom(){ return nom; } public String toString(){ return nom; } public String toProlog(){ // règle sémantique rq2 return nom; } } //public class Et extends Conj { private Prop p; private Conj c; public Et(Prop mg,Conj md){ p = mg; c = md; } public String toString(){ return p.toString() + " & " + c.toString(); } public String toProlog(){ // règle sémantique rq1 return p.toProlog() + " , " + c.toProlog(); } } //public class False extends Conj{ public String toString(){ return "False"; } public String toProlog(){ return " false "; } } //public class True extends Conj{ public String toString(){ return "True"; } public String toProlog(){ return " true "; } } public class TestFCompl{ public static void main(String [] args){ Fcompl f=new Fcompl( new Prop("p") , new Ou( new Et( new Prop("q") , new Et(new Prop("r") , new Prop("s"))), new Ou( new Prop("t"), new Et(new Prop("q"),new True()) ))); System.out.println(f.toString()); System.out.println(f.toProlog()); } }>java TestFCompl
p <-> q & r & s v t & q v True p :- q , r , s. p :- t , q. p :- true. le graphe des classes :![]()