Précédent   Forum du club des développeurs et IT Pro > Autres langages > Autres langages > Prolog
Prolog Forum d'entraide sur la programmation en langage Prolog. Avant de poster : Cours Prolog
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 02/01/2013, 18h36   #1
riri44
Invité de passage
 
Femme rihab ben abdallah
Étudiant
Inscription : janvier 2013
Messages : 1
Détails du profil
Informations personnelles :
Nom : Femme rihab ben abdallah
Localisation : Tunisie

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : janvier 2013
Messages : 1
Points : 0
Points : 0
Par défaut demande d'aide à résoudre un problème en prolog

voici ces les données de problème
Nous traitons Le problème de l'estimation du prix d'un appartement. Pour simplifier, nous supposons que l'appartement est caractérisé par :

la superficie,
le nombre des pièces,
le nombre de balcons,
l'existence d'un parking.

Nous ne disposons pas de règles ou de méthode permettant d'estimer le prix d'un appartement donnée. Par contre, nous disposons de la base de cas suivante :

cas1
l'appartement cas1 a une superficie de 70 m2, est composé de trois pièces, un balcon et dispose d'un parking et coûte 600 KF.
cas2
l'appartement cas2 a une superficie de 50 m2, est composé de deux pièces, et dispose d'un parking et coûte 500 KF.
cas3
l'appartement cas3 a une superficie de 95 m2, est composé de cinq pièces, deux balcons et dispose d'un parking et coûte 900 KF.
De plus, l'agent immobilier, étant gentil, nous a donnés les informations suivantes qui pour lui, ne peuvent être qu'approximatives :

Un balcon de plus augmente le prix de l'appartement de 15 KF.
Le parking augmente le prix d'un appartement de 15 KF.
A première vue, disons qu'il faut compter à peu près 120 KF si vous voulez une pièce de plus (en supposant qu'une pièces correspond à 15 m2 de superficie en moyenne).
Pour le même nombre de pièces, un mètre carré de plus coûte 8 KF.

2 Modélisation d'un système RàPC simple

Exercice 1 Modéliser un cas en utilisant la logique du 1er ordre. Quelle est la partie problème et la partie solution.
Exercice 2 Donner une fonction de mesure de similarité possible entre deux cas.
Exercice 3 En supposant qu'on utilise un modèle de mémoire plate, et que le coût de l'opération de similarité entre deux valeurs du même attribut est CO et que le coût de comparaison entre deux valeurs de similarité est CS . Donner le coût du processus de la remémoration CM en supposant qu'on ne remémore que le meilleur cas et que la base de cas contient N cas.
Exercice 4 Modéliser la connaissance de l'adaptation en utilisant la logique du premier ordre.
Exercice 5 En supposant que le coût du déclenchement d'une règle d'adaptation est égale à CA. Donner le coût maximal du processus d'adaptation.
Exercice 6 Supposons qu'on cherche à estimer le prix d'un appartement ayant une superficie de 80 m2, contenant 4 pièces, avec un balcon, et dispose d'un parking. Faire le calcul du prix estimé.
Exercice 7 Répéter l'exercice 6 en tenant compte de l'hypothèse suivante : le système remémore les deux meilleurs cas et la solution proposée est la moyenne pondérée par les similarités des deux solutions adaptées.

3 Implémentation en Prolog

Implémenter en Prolog le système RàPC d'estimation du coût d'un appartement avec l'hypothèse de la remémoration d'un seul cas chaque cycle. Le système doit contenir les phases : remémoration, adaptation, révision et mémorisation. La révision de la solution se fait par un expert qui serait d'accord ou non avec la solution proposée et qui précise la valeur dans le cas de désaccord.
Et voici le code en Prolog mais ça arrive pas à bien modéliser le problème car je travaille avec le prolog 2.0 mais vous pouvez m'aider en donnant une solution en prolog SWI:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
/*appartement(X,Y):-problem(X),solution(Y).

%Superficie, Nbr piece, balcon, parking.

problem([X,Y,Z,T]):-float(X),integer(Y), integer(Z),bol(T).

bol(0).
bol(1).

solution(Y):-float(Y).*/

sim([X,Y,Z,T],[X1,Y1,Z1,T1],S):-W1 is 1- ((abs(X1-X))/100), 
W2 is 1- ((abs(Y1-Y))/4), W3 is 1- ((abs(Z1-Z))/1), 
W4 is 1- ((abs(T1-T))/2), S is W1+W2+W3+W4.

for(X,Y):-X,Y,fail.
for(X,Y).

rem(X):- for(appartement(P,S),(sim(X,P,Sim),s(_,_,Asim),
Sim>Asim,retract(s(_,_,_)),assert(s(P,S,Sim)))).

rememore(X,P,S,Sim):-assert(s(p,s,-1)),rem(X),
retract(s(P,S,Sim)).

init:-
assert(appartement([70,3,1,1],600)),
assert(appartement([50,2,0,1],500)),
assert(appartement([95,5,2,1],900)).


memorise(P,S):-assert(appartement(P,S)).

rapc(X,S2):-rememore(X,P,S,Sim),adapt(P,S,X,S1),write('le prix est '), 
write(S1),nl, revise(S1,S2),memorise(X,S2). 

adaptB([X,Y,Z,T],S,[X1,Y1,Z1,T1],S1):- W is (Z1-Z)*15, S1 is S+W.

adaptP([X,Y,Z,T],S,[X1,Y1,Z1,T1],S1):- W is (T1-T)*15, S1 is S+W.

adaptPs([X,Y,Z,T],S,[X1,Y1,Z1,T1],S1):- W is (Y1-Y)*120, S1 is S+W.

adaptS([X,Y,Z,T],S,[X1,Y1,Z1,T1],S1):- W is (X1-X)*8, S1 is S+W.

adapt([X,Y,Z,T],S,[X1,Y1,Z1,T1],S1):- adaptB([X,Y,Z,T],S,[X1,Y1,Z1,T1],W1), 
adaptP([X,Y,Z,T],W1,[X1,Y1,Z1,T1],W2), adaptPs([X,Y,Z,T],W2,[X1,Y1,Z1,T1],W3), NS is ((Y1-Y)*15)+X,
 adaptS([NS,Y,Z,T],W3,[X1,Y1,Z1,T1],S1).

reponse(X) :-write('etes vous d accord avec la solution'), nl, read(X).

revise(S1,S1):-reponse(o),!.
revise(S1,S2):-write('entrer la valeur désirée du prix'),nl, read(S2).
et merci en avance
riri44 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2013, 08h50   #2
Trap D
Rédacteur/Modérateur
 
Avatar de Trap D
 
Inscription : septembre 2003
Messages : 4 443
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 4 443
Points : 5 310
Points : 5 310
Bonjour

J'ai commencé à regarder le code.
Quelques commentaires seraient les bienvenus.
Quel prédicat lance le programme ? En tout cas ce n'est pas init.

Ensuite il n'y a beaucoup de variables libres dans le code (elles sont signalées en noir dans l'éditeur) et c'est très génant, est-ce normal ou non ? Cela pose problème.
Il faut corriger ces erreurs pour qu'on puisse avancer.
Exemple :
Code :
1
2
adaptB([X,Y,Z,T],S,[X1,Y1,Z1,T1],S1):- 
	W is (Z1-Z)*15, S1 is S+W.
Il y a 6 variables libres dans cette régle X,Y,X1,Y1,T1 est-normal ? Qu'est supposé faire cette règle ? Si ces variables ne sont pas utiles, il faut les faire précéder par un _ (X ==> _X) cela facilite la lecture et le débogage du code.
__________________
"La haine seule fait des choix" - Koan Zen
"Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
"Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
Faites du Prolog, ça vous changera les idées !
Ma page Prolog
Mes codes sources commentés

Mon avatar : Intérieur avec jeune femme de Vilhelm Hammershoi
Trap D est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/03/2013, 13h13   #3
MALING1
Invité régulier
 
Homme
Étudiant
Inscription : septembre 2012
Messages : 10
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations professionnelles :
Activité : Étudiant
Secteur : Enseignement

Informations forums :
Inscription : septembre 2012
Messages : 10
Points : 6
Points : 6
Par défaut SWI-Prolog grammaire DCG

Salut tout le monde!

J'ai un petit, voire gros souci. Avec mon groupe d'étudiants nous avons réussi à mettre au point un analyseur syntaxique qui permet de produire un arbre avec les données de chaque constituant de la phrase. Notre champ d'étude est la topicalisation en français.

Le hic, c'est que nous devons tenir compte du fait qu'on ne peut pas utiliser, par exemple, le pronom "moi" deux fois dans la même phrase pour décrire le sujet.

ex: "moi et moi sommes partis"
ou encore "nous et nous sommes venus"

Voici ce qu'on a mis en place pour faire la conjonction de coordination:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
conjonction([X|R],R,Conj,Traits):-conjonction(X,Conj,Traits).
conjonction(et,conjonction_de_coordination(et),coordone(et)).
coordone(et,Traitssuj1,Traitssuj2,Traitssujet):-
    genre(Traitssuj1,Traitssuj2,Genre,Reste1,Reste2),
    personne(Reste1,Reste2,Personne,RReste1,RReste2),
    nombre(RReste1,RReste2,Nombre,RRReste1,RRReste2),
    funify(RRReste1,RRReste2,Total),
    funify(Total,Nombre,Total1),
    funify(Total1,Personne,Total2),
    funify(Total2,Genre,Traitssujet).
genre(Traitssuj1,Traitssuj2,Genre,Reste1,Reste2):-
    pick(genre:V1,Traitssuj1,Reste1),pick(genre:V2,Traitssuj2,Reste2),!,
    ((V1=V2)->(Genre=[genre:V1]);(Genre=[genre:masc])).
genre(Traitssuj1,Traitssuj2,Genre,Reste1,Reste2):-
    (    (pick(genre:V1,Traitssuj1,Reste1),Traitssuj2=Reste2);
    (pick(genre:V1,Traitssuj2,Reste2),Traitssuj1=Reste1)    ),!,
    ((V1=masc)->(Genre=[genre:masc]);(Genre=[])).
genre(Traitssuj1,Traitssuj2,Genre,Reste1,Reste2):-
    not(member(genre:_,Traitssuj1)),not(member(genre:_,Traitssuj2)),Genre=[],
    Traitssuj1=Reste1,Traitssuj2=Reste2.
personne(Reste1,Reste2,Personne,RReste1,RReste2):-
        pick(personne:Pers1,Reste1,RReste1),pick(personne:Pers2,Reste2,RReste2),
        ((Pers1>=Pers2)->(Personne=[personne:Pers2]);
        (Personne=[personne:Pers1])).
nombre(RReste1,RReste2,[nombre:pl],RRReste1,RRReste2):-
    pick(nombre:_,RReste1,RRReste1),pick(nombre:_,RReste2,RRReste2).
Quelqu'un saurait-il m'expliquer comment je pourrais éviter les doublons? Merci!
MALING1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/03/2013, 13h14   #4
MALING1
Invité régulier
 
Homme
Étudiant
Inscription : septembre 2012
Messages : 10
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations professionnelles :
Activité : Étudiant
Secteur : Enseignement

Informations forums :
Inscription : septembre 2012
Messages : 10
Points : 6
Points : 6
Je pense qu'il faut effectuer un "if then" ou un truc du style
MALING1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 11h05.


 
 
 
 
Partenaires

Hébergement Web