IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Prolog Discussion :

demande d'aide à résoudre un problème en prolog


Sujet :

Prolog

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

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

    Informations forums :
    Inscription : Janvier 2013
    Messages : 1
    Points : 1
    Points
    1
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : La Madeleine à la veilleuse de Georges de La Tour

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    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 : 8
    Points
    8
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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!

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    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 : 8
    Points
    8
    Par défaut
    Je pense qu'il faut effectuer un "if then" ou un truc du style

Discussions similaires

  1. [Free Pascal] Jeu d'arcade : besoin d'aide pour résoudre un problème
    Par kingmodi dans le forum Free Pascal
    Réponses: 2
    Dernier message: 09/11/2014, 11h48
  2. Réponses: 1
    Dernier message: 27/07/2011, 19h00
  3. [Demande d'aide]Problème java
    Par steph2608 dans le forum Administration système
    Réponses: 2
    Dernier message: 21/07/2010, 23h32
  4. Demande d'aide : problème avec iReport
    Par sessionakh dans le forum iReport
    Réponses: 1
    Dernier message: 19/09/2007, 15h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo