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 :

Définir des prédicats


Sujet :

Prolog

  1. #1
    Membre du Club
    Inscrit en
    Mai 2003
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 62
    Points : 58
    Points
    58
    Par défaut Définir des prédicats
    Je débute en Prolog et j'ai encore beaucoup de mal à transcrire les règles de mes problèmes.

    Par exemple, dans un de mes problèmes je dois reconstruire un tableau qui pourrait me rappeler tous les détails de 5 foires auxquelles j'ai participe.

    1. Les cinqs mois ou ont eu lieu les foires sont Mars, Mai, Juin, Aout, Septembre.
    2. Les cinqs villes qui ont accueilli les foires sont Lille, Marseille, Bordeaux, Paris, Toulouse.
    3. Le nombre d'exposants sont 180, 200, 240, 260, 280.
    4. Les longueurs des stands sont 3, 4, 5, 6, 7 metres.
    5. La foire de Lille attira 240 exposants.
    6. La foire de 200 exposants n'eut lieu ni en Aout, ni en Septembre.
    7. La foire de Mai attira 40 personnes de moins que celle de Paris.
    8. La foire de Bordeaux eut lieu en Juin
    9. La foire de Toulouse n'eut pas lieu en Mai
    10. La foire de Paris n'eut pas lieu en septembre
    11. A la foire de Paris j'avais un stand de 3 metres.
    12. A la foire de 200 exposants j'avais un stand de 4 metres.
    13. A la foire de Bordeaux mon stand faisait 2 metres de plus qu'a la foire de180 exposants.
    Voilà pour l'énoncé. A partir de ces règles, j'ai dressé 4 listes de données.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    domain([Mars, Mai, Juin, Aout, Septembre],1,5),
    all_different([Mars, Mai, Juin, Aout, Septembre]),
     
    domain([Lille, Marseille, Bordeaux, Paris, Toulouse],1,5),
    all_different([Lille, Marseille, Bordeaux, Paris, Toulouse]),
     
    domain([180, 200, 240, 260, 280],1,5),
    all_different([180, 200, 240, 260, 280]),
     
    domain([3, 4, 5, 6, 7],1,5),
    all_different([3, 4, 5, 6, 7]),
    Ensuite j'ai essayé de transcrire les règles :
    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
    % 5
    Lille #= 240,
     
    % 6
    ((Aout #/= 200) #/\ (Septembre #/= 200)),
     
    % 7
    %moins40Personnes(Mai, Paris),
     
    % 8
    Bordeaux #= Juin,
     
    % 9
    Toulouse #/= Mars,
     
    % 10
    Paris #/= Septembre,
     
    % 11
    Paris #= 3,
     
    % 12
    200 #= 4,
     
    % 13
    % plus2Metres(Bordeaux,180),
    Mes questions :

    - D'abord je ne sais pas du tout si la manière d'écrire mes règles est correcte.

    - Ensuite, pour les règles 6 et 13, je pense que l'écrire des prédicats est une solution mais je ne sais pas du tout comment les implémenter. Par exemple, est-ce correct d'écrire : Bordeaux = 180 (exposants) + 2 (metres) ? Ca me semble illogique. On n'additionne pas des pommes avec des poires ?

    - Enfin, pour une résolution de mon problème en backtracking, comment organiser l'appel des règles ?

    Merci infiniment pour ceux qui prendront le temps de m'écrire un mot.
    "Le plus simple est toujours le meilleur, mais le meilleur n'est pas toujours le plus simple"

  2. #2
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Un problème similaire :
    http://www.developpez.net/forums/showthread.php?t=84237

    Résolution avec et sans CLP.
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  3. #3
    Membre du Club
    Inscrit en
    Mai 2003
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 62
    Points : 58
    Points
    58
    Par défaut Merci !
    Merci de ta reponse.

    Je suis alle voir l'exemple que tu mentionnes. Je suis en train de l'adapter a la resolution de mon probleme.

    Mais pour resoudre l'ecriture de mes predicats, je ne sais pas comment ecrire les operations qui me permettent de decrire les regles.

    Je cherche des exemples du genre "X fait 10 machin de plus que le chose de Y".
    "Le plus simple est toujours le meilleur, mais le meilleur n'est pas toujours le plus simple"

  4. #4
    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
    Je cherche des exemples du genre "X fait 10 machin de plus que le chose de Y".
    Ben ça peut se faire comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    regle :-
      machin(X),
      chose(Y),
      X is Y + 10.
    Il suffit d'adapter au cas des exposants et des stands !
    "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

  5. #5
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Citation Envoyé par Xiao-An
    Je cherche des exemples du genre "X fait 10 machin de plus que le chose de Y".
    Non testé, mais ça donne l'idée générale :
    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
    hypothese(Liste) :-
      nth0(I1, Liste, (MachinX, _, _, _) ),
      nth0(I2, Liste, (MachinY, _, _, _) ),
      I1 \= I2,
      unifie(MachinX, MachinY).
     
     
    unifie(MachinX, MachinY) :-
      nonvar(MachinY),
      !,
      MachinX is MachinY + 10.
     
    unifie(MachinX, MachinY) :-
      nonvar(MachinX),
      !,
      MachinY is MachinX - 10.
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

Discussions similaires

  1. Définir des variables
    Par rane dans le forum Langage
    Réponses: 11
    Dernier message: 10/05/2006, 19h02
  2. Comment définir des raccourcis clavier ?
    Par st0nky dans le forum Composants VCL
    Réponses: 3
    Dernier message: 07/12/2005, 20h37
  3. Réponses: 2
    Dernier message: 18/11/2005, 21h40
  4. [Tomcat][Role] définir des roles a partir d'un certificat
    Par pmartin8 dans le forum Tomcat et TomEE
    Réponses: 8
    Dernier message: 27/09/2005, 20h25
  5. [FLASH MX2004 ] Définir des "zones cliquables"
    Par chodaboy34 dans le forum Flash
    Réponses: 3
    Dernier message: 07/11/2004, 18h58

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