Q1 :


Q2.1 : et( ( ou( ( a,b,c ) , negation(a) , ou( ( g , a ) ) )])

Q2.2 :
toString(A) :- atom(A) , write(A).
toString(negation(F)) :- write(~) , formuleParenthesee(F).
toString(et(LET)) :- write('('), writeLEt(LET), write(')') .
toString(ou(LOU)) :- write('('), writeLOu(LOU), write(')') .

formuleParenthesee(A) :- atom(A) , write(A).
formuleParenthesee(F) :- not atom(F) , write('('), toString(F), write(')') .

writeLEt([F1 , F2]) :- toString(F1),write(' & '),toString(F2).
writeLEt([F1 | LF]) :- LF \= [F] , toString(F1),write(' & '),writeLEt(LF).

writeLOu([F1 , F2]) :- toString(F1),write(' v '),toString(F2).
writeLOu([F1 | LF]) :- LF \= [F] , toString(F1),write(' v '),writeLOu(LF).


Q2.3 :
?- toString(et([ou([a,b,c]),neg(a),ou([g,a])])).
   ((a v b v c) & ~a & (g v a))
              yes


Q3.1:
?- formule( ['(',a,v,b,v,c,')',&,~,a,&,g,v,a] , []).

          yes


Q3.2 :

formule(F)  --> proposition(F).
formule(F)  --> negation(F).
formule(F)  --> conjonction(F).
formule(F)  --> disjonction(F).
formule(F)  --> ['('] , formule(F) , [')'].

negation(negation(F)) --> [~] , proposition(F).
negation(negation(F)) --> [~] , ['('] , formule(F) , [')'].

conjonction(et([MG | Conj])) --> 
	membreGauche(MG) , [ & ] , conjonction(et(Conj)).
conjonction(et([MG , NConj])) --> 
	membreGauche(MG) , [ & ] , nonConjonction(NConj).
disjonction(ou([MG | Disj])) --> 
	membreGauche(MG) , [ v ] , disjonction(ou(Disj)).
disjonction(ou([MG , NDisj])) --> 
	membreGauche(MG) , [ v ] , nonDisjonction(NDisj).

proposition(A) --> [A] , {atom(A) , not member(A , ['(',')',[],&,~,v ])}.

membreGauche(A)  --> proposition(A).
membreGauche(A)  --> negation(A).
membreGauche(F)  --> ['('] , formule(F) , [')'].

nonDisjonction(F)  --> negation(F).
nonDisjonction(F)  --> conjonction(F).
nonDisjonction(F)  --> proposition(F).
nonDisjonction(F)  --> ['('] , formule(F) , [')'].

nonConjonction(F)  --> negation(F).
nonConjonction(F)  --> disjonction(F).
nonConjonction(F)  --> proposition(F).
nonConjonction(F)  --> ['('] , formule(F) , [')'].

tout ensemble : 
?- formule(AST ,['(',a,v,b,v,c,')',&,~ a,&,g,v,a] , []), toString(AST).
	((a v b v c) & ~a & (g v a))
	AST = et([ou([a,b,c]),neg(a),ou([g,a])]) 
	yes



Q4 : Java
class NombreOperandesException extends RuntimeException{}

abstract class Terme{
	abstract public String toString();
	
	java.util.Enumeration enfants(){throw new NombreOperandesException();}
	Terme ajouter( Terme t){throw new NombreOperandesException();}
	void retirer(Terme t){throw new NombreOperandesException();}
	Terme leTerme(int i){throw new NombreOperandesException();}
}
class Atome extends Terme{
	private String s;
	Atome(String s){ this.s = s;}
	public String toString(){return s;}
}

abstract class Formule extends Terme{
	abstract public String toString();

	protected java.util.Vector operandes = new java.util.Vector();
	java.util.Enumeration enfants(){return operandes.elements();}
	Terme ajouter( Terme t){
		if( this == t) 
			throw new NombreOperandesException();
		else 
			operandes.addElement(t);
		return this;
	}
	void retirer(Terme t){ 
		if(!operandes.removeElement(t))
			throw new NombreOperandesException();
	}
	Terme leTerme(int i){
		try{ 
			return (Terme)operandes.elementAt(i);
		}catch(ArrayIndexOutOfBoundsException e){
			throw new NombreOperandesException();
		}
	}
}

class Negation extends Formule{
	Terme ajouter( Terme t){
		if (operandes.size()==0)
			super.ajouter(t);
		else
			throw new NombreOperandesException();
		return this;
	}

	public String toString(){
		if (operandes.size() != 1) throw new NombreOperandesException();
		return "~(" + leTerme(0) + ")";
	}
}

class Et extends Formule{	
	public String toString(){
		if (!(operandes.size() >= 2)) throw new NombreOperandesException();
		String s = "(";
		for(java.util.Enumeration e = enfants();e.hasMoreElements();){
			s = s + e.nextElement();
			if (e.hasMoreElements()) s = s + " & ";
		}
		return s + ")";
	}
}
class Ou extends Formule{
	public String toString(){
		if (!(operandes.size() >= 2)) throw new NombreOperandesException();
		String s = "(";
		for(java.util.Enumeration e = enfants();e.hasMoreElements();){
			s = s + e.nextElement();
			if (e.hasMoreElements()) s = s + " v ";
		}
		return s + ")";
	}
}

public class Propositionnel {

	public static void main(String args[]){
	try{
		Terme	termeEt = new Et().ajouter(
					new Atome("b")).ajouter(
						new Atome("c")).ajouter(new Atome("e"));

		Terme	termeNeg = new Negation().ajouter(termeEt);
		Terme	termeOu = new Ou().ajouter(
					new Atome("a")).ajouter(termeNeg);
		System.out.println(" s = " + termeOu.toString());
		// affiche	s = (a v ~((b & c & e)))

		System.out.println(new Negation().ajouter(termeNeg));
		// affiche	~(~((b & c & e)))
		System.out.println(new Et().ajouter(termeEt));
	
		termeNeg.ajouter(new Atome("f"));
		// levee d'exception, la negation est d'arite 1
		// affiche	exception de type NombreOperandesException
		}catch(NombreOperandesException e){
			System.out.println("exception : NombreOperandesException ");
		}
	}

}