1- Q1 :
cpv(X , Y) :- h(X) , d(Y).
cpv(X , Y) :- p(X) , r(Y).
cpv(X , Y) :- cpv(X , Z) , cpv(Z , Y).
h(bob).
p(rex).
r(jeannot).
d(X) :- p(X).
Q2 : du fait de la récursivité gauche dans cpv(X , Y) :- cpv(X , Z) , cpv(Z , Y).
Q3 : {h(bob) , h(rex), h(jeannot) ,
p(bob) , p(rex), p(jeannot) ,
r(bob) , r(rex), r(jeannot) ,
d(bob) , d(rex), d(jeannot) ,
cpv(bob , bob) , cpv(bob , rex) , cpv(bob
, jeannot) ,
cpv(rex , bob) , cpv(rex , rex) , cpv(rex
, jeannot) ,
cpv(jeannot , bob) , cpv(jeannot , rex)
, cpv(jeannot , jeannot) }
Q4 : Tp(@) = {h(bob) , p(rex), r(jeannot)}
Tp(Tp(@)) = Tp(@) U {cpv(rex , jeannot)
, d(rex)}
Tp(Tp(Tp(@))) = Tp(Tp(@)) U {cpv(bob ,
rex)}
Tp(Tp(Tp(Tp(@))) = Tp(Tp(Tp(@))) U {cpv(bob
, jeannot)}
Tp(Tp(Tp(Tp(@))) = Tp(Tp(Tp(Tp(@)))) = SEM
chaînage Avant = {cpv(rex , jeannot) , d(rex) , cpv(bob , rex) , cpv(bob
, jeannot)}
Donc la réponse à la question cpv(bob , jeannot) ? est
OUI!!!
2- Prolog /DATALOG :
2.1
dh('I12345' , 5 , 1).
dh('I12345' , 6 , 2).
...
cpt(N) :- retract('CPT'(N)), ! ,
NN is N+1,
assert('CPT'(NN)).
cpt(0) :- assert('CPT'(1)).
selectCountFromDH(_) :-
dh(_,_,_),
cpt(_),
fail.
selectCountFromDH(Count) :- 'CPT'(Count).
2.2
selectFromDHWhere(CHAMPS=VALEUR) :-
table(DH),
arg(Num , DH , CHAMPS),
dh(M,Dh,Note),
arg(Num, dh(M,Dh,Note), VALEUR),
write(dh(M,Dh,Note)),nl,
fail.
selectFromDHWhere(_) :- write(ouf),nl,nl,nl.
3-1 Sémantique Structurelle
3-1 :- op(111,xfx, # ). normeQ(A # 1 , A):- integer(A) , !. normeQ(A # B , AA) :- pgdc(A,B,P), 1 is B / P , ! , AA is A / P. normeQ(A # B , AA # BB) :- pgdc(A,B,P), BB is B / P , AA is A / P. fraction(A # B , A # B). fraction(A , A # 1) :- integer(A). 3-2 Sémantique Structurelle evaq(A # B,VQ) :- normeQ(A # B , VQ). evaq(Q1 + Q2,VQ) :- fraction(Q1,A # B) , fraction(Q2,C # D), Num is A*D + B*C,Dem is B*D, normeQ(Num # Dem , VQ). evaq(Q1 * Q2,VQ) :- fraction(Q1,A # B) , fraction(Q2,C # D), Num is A*C, Dem is B*D, normeQ(Num # Dem , VQ). evaq(Q1 / Q2,VQ) :- fraction(Q1,A # B) , fraction(Q2,C # D), Num is A*D, Dem is B*C, normeQ(Num # Dem , VQ). ?-evaq((456 # 101 + 33 # 2 )*(18 # 47 + 24# 7 )/( 1# 181 )). P = 481752315#33229 Yes
exq(VQ) --> tq(VQ1) , ['+'] , exq(VQ2) , {evaq(VQ1 + VQ2 , VQ)}.
exq(VQ) --> tq(VQ).
tq(VQ) --> fq(VQ1) , ['*'] , tq(VQ2) , {evaq(VQ1 * VQ2 , VQ)}.
tq(VQ) --> fq(VQ1) , ['/'] , tq(VQ2) , {evaq(VQ1 / VQ2 , VQ)}.
tq(VQ) --> fq(VQ).
fq(VQ) --> [X1] , [ # ] , [X2] , {integer(X1) , integer(X2) , evaq(X1 # X2 , VQ)}.
fq(X) --> [X] , {integer(X)}.
fq(VQ) --> ['('] , exq(VQ), [')'].
om --> ['*'].
om --> ['/'].
/*
?- exq(Q , ['(',456, # ,101 , '+' , 33, # ,2 , ')' , '*' , '(' , 18, # ,47 , '+' , 24, # ,7 , ')' , '/' , '(' , 1, # ,181 , ')'] , []).
Q = 481752315#33229 ;
No
*/
4- Java :
abstract class AutomateDeMoore{
public Etat etatCourant;
//@ invariant etatCourant != null;
public AutomateDeMoore(){ //@ assume etatCourant != null;
}
//@ requires entree>=0 & entree<etatCourant.etatsSuivants.length;
//@ modifies etatCourant;
//@ ensures \result==etatCourant;
//@ ensures etatCourant==\old(etatCourant).etatsSuivants[entree];
public Etat transiter(int entree){
etatCourant=etatCourant.transiter(entree);
return etatCourant;
}
// la sortie est associée à l'état courant (Moore)
//@ modifies etatCourant.sortie;
//@ ensures \result==etatCourant.sortie;
public char action(){
return etatCourant.action();
}
}
//public
class Automate extends AutomateDeMoore{
Etat e0,e1,e2;
//@ invariant \typeof(etatCourant)==\type(E0) || \typeof(etatCourant)==\type(E1) || \typeof(etatCourant)==\type(E2);
//@ invariant etatCourant==e0 || etatCourant==e1 || etatCourant==e2 ;
//@ invariant \typeof(e0)==\type(E0) & \typeof(e1)==\type(E1) & \typeof(e2)==\type(E2) ;
//@ invariant e0.etatsSuivants[0] == e1 & e0.etatsSuivants[1] == e2;
//@ invariant e1.etatsSuivants[0] == e1 & e1.etatsSuivants[1] == e2;
//@ invariant e2.etatsSuivants[0] == e1 & e2.etatsSuivants[1] == e2;
//@ invariant Etat.infEntree==0 & Etat.maxEntree==1;
//@ invariant (\forall Etat e; e.etatsSuivants.length==2 );
// modifies e0.singleton,e1.singleton,e2.singleton;
//@ modifies Etat.infEntree,Etat.maxEntree;
// ensures e0.singleton & e1.singleton
// ensures \fresh(e0) & \fresh(e1) & \fresh(e2) & \fresh(etatCourant);
//@ ensures etatCourant==e0;
public Automate(){
//créer les états et les connecter par des transitions ordonnées
etatCourant=e0=new E0();
e1=new E1();
e2=new E2();
e0.setEtatsSuivants(new Etat[]{e1,e2});
e1.setEtatsSuivants(new Etat[]{e1,e2});
e2.setEtatsSuivants(new Etat[]{e1,e2});
// set e0.singleton=true;
// set e1.singleton=true;
//@ set Etat.infEntree = 0 ;
//@ set Etat.maxEntree = 1;
}
//@ also_ensures \old(etatCourant) == e0 && entree == 0 ==> etatCourant == e1
//@ also_ensures \old(etatCourant) == e0 && entree == 1 ==> etatCourant == e2;
//@ also_ensures \old(etatCourant) == e1 && entree == 0 ==> etatCourant == e1;
//@ also_ensures \old(etatCourant) == e1 && entree == 1 ==> etatCourant == e2;
//@ also_ensures \old(etatCourant) == e2 && entree == 0 ==> etatCourant == e1;
//@ also_ensures \old(etatCourant) == e2 && entree == 1 ==> etatCourant == e2;
public Etat transiter(int entree){
return super.transiter(entree);
}
//@ invariant e0.sortie=='a' & e1.sortie=='b' & e2.sortie=='c';
}
// public
abstract class Etat{
//@ ghost static public int infEntree;
//@ ghost static public int maxEntree;
protected /*@ spec_public non_null*/ Etat[] etatsSuivants;
//@ invariant \nonnullelements(etatsSuivants) && etatsSuivants.length>0;
public Etat(){
//@ assume \nonnullelements(etatsSuivants)&& etatsSuivants.length>0;
}
//@ requires \nonnullelements(etatsSuivants) && etatsSuivants.length>0;
//@ modifies this.etatsSuivants;
//@ ensures this.etatsSuivants==etatsSuivants;
public void setEtatsSuivants(Etat[] etatsSuivants){
this.etatsSuivants=etatsSuivants;
}
//@ ensures \result==etatsSuivants;
public Etat[] getEtatsSuivants(){
return etatsSuivants;
}
//@ requires i>=0 & i<etatsSuivants.length;
//@ ensures \result==etatsSuivants[i];
public Etat getEtatsSuivants(int i){
return etatsSuivants[i];
}
//Automate de Moore : l'action de sortie est associée à l'état
protected char sortie;
//@ modifies sortie;
//@ ensures \result==sortie;
abstract public char action();
//@ requires entree>=0 & entree<etatsSuivants.length;
//@ ensures \result != null
//@ ensures \result==this.etatsSuivants[entree];
public Etat transiter(int entree){
return etatsSuivants[entree];
}
}
//public
final class E0 extends Etat{
//@ ensures sortie=='a';
public E0(){
sortie='a';
}
public char action(){
return sortie;
}
}
//public
final class E1 extends Etat{
//@ ensures sortie=='b';
public E1(){
sortie='b';
}
public char action(){
return sortie;
}
}
//public
final class E2 extends Etat{
//@ ensures sortie=='c';
public E2(){
sortie='c';
}
public char action(){
return sortie;
}
}
public class EtatEntierSimple{
static Automate detecteur;
// ensures detecteur.etatCourant == detecteur.e2;
public static void main(String[] args){
detecteur= new Automate();
detecteur.transiter(0);
detecteur.action();
detecteur.transiter(1);
detecteur.action();
detecteur.transiter(1);
detecteur.action();
}
}