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 :

Labyrinthe : problème de lien entres les cases


Sujet :

Prolog

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 188
    Points : 140
    Points
    140
    Par défaut Labyrinthe : problème de lien entres les cases
    Voilà, je suis en train de coder un labyrinthe en Prolog.
    J'ai un problème dans la phase de recherche de chemin avec l'algorithme de Djikstra.
    15 ?- lab.
    ERROR: is/2: Arguments are not sufficiently instantiated
    ^ Exception: (12) findall(_G698, (accessible(case(1, 1, 0), _G673), \+isVisited([0-[case(1, 1, 0)]], _G673), dans_liste(_G673, [[case(1, 1, 0), case(1, 2, 0), case(..., ..., ...)|...], [case(2, 1, h), case(..., ..., ...)|...], [case(..., ..., ...)|...], [...|...]|...]), _G692 is 0+1, _G698=_G692-[_G673, case(..., ..., ...)]), _L269) ? abort
    % Execution Aborted
    On dirait que accessible n'arrive pas à trouver la case accessible à partir de case (1,1,0). Pourtant, si j'exécute juste accessible(C,C1) ça marche :
    11 ?- accessible(case(1,1,0),C).

    C = case(1, 2, 0)

    Yes
    En effet, voilà, j'ai codé mon labyrinthe sous forme d'une liste de listes (lignes) et chaque case par ses coordonnées case(X,Y,ValeurObstacle)
    ValeurObstacle : pour voir si il ya un obstacle avec les cases adjacentes :
    • h avec la suivante horizontalement
    • v avec la suivante verticalement
    • hv les deux

    Pour expliquer mon vrai problème, c'est comment faire une écriture des liens (passage possible) entre deux cases sans être amené à écrire 200 lignes comme celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    lien(C,C1) :- lien(C1,C).
    lien(case(1,1,X),case(1,2,0)):
    lien(case(1,2,0),case(1,3,0)).
    lien(case(1,3,0),case(1,4,0)).
    lien(case(1,4,0),case(1,5,0)).
    lien(case(1,5,0),case(1,6,0)).
    lien(case(1,6,0),case(1,7,0)).
    J'ai essayé de minimiser en notant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lien(case(1,1,X),case(1,2,0)):- X=0; X=h.
    Ca donne :
    15 ?- lab.
    ERROR: is/2: Arguments are not sufficiently instantiated
    ^ Exception: (12) findall(_G698, (accessible(case(1, 1, 0), _G673), \+isVisited([0-[case(1, 1, 0)]], _G673), dans_liste(_G673, [[case(1, 1, 0), case(1, 2, 0), case(..., ..., ...)|...], [case(2, 1, h), case(..., ..., ...)|...], [case(..., ..., ...)|...], [...|...]|...]), _G692 is 0+1, _G698=_G692-[_G673, case(..., ..., ...)]), _L269) ? abort
    % Execution Aborted
    Et pourtant
    11 ?- accessible(case(1,1,0),C).

    C = case(1, 2, 0)

    Yes
    La ligne de code :
    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
     % Recherche des points susceptibles d'être ajoutés au graphe
      %
     
     
    findall(
        NP,            % on fait la liste de tous les points tels que:
     
        ( 
          accessible(P1,P2),          % - il existe un arc allant de P1 à P2, de distance Dist
          \+isVisited(Visited, P2), % - le point P2 n'a pas encore été visité
          dans_liste(P2, NewLab),
          NLen is Len+1,         % on calcule la distance entre l'origine et le point P2
     
          NP=NLen-[P2,P1|Path]  % on met chaque élément de la liste sous la forme: Distance-Chemin
                                % pour pouvoir les trier avec le prédicat keysort/2
        ),
     
        L1     % on met le résultat dans la liste L1
      ),
    Merci de me fournir une petite aide, c'est la première fois que je touche au PROLOG.

  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
    Si je comprends bien, c'est plus un problème de représentation des données en Prolog qu'un problème de programmation Prolog (bien que ce soit lié !).
    Tu ne peux pas essayer d'écrire une relation entre les coordonnées des cases et les obstacles éventuels pour dire qu'elles sont liées ?
    "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
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 188
    Points : 140
    Points
    140
    Par défaut
    En effet, je suis arrivé à résoudre ce problème mais un autre s'affiche à l'utilisation de write et read. J'ai comme une boucle : en effet, mon problème est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    fct(T):-
    Write('x:'),
    read('X),
    Write('Y:'),
    read('Y),
    traitement(X,Y),
    autre_traitement(X,Y),
    autre_traitement(X,Y).
    en lançant ce predicat, le programme fait une boucle : il revient toujours au Write('x:'), sans passer par les traitements.
    Merci de me dire s'il y a une erreur.

  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
    Tu utilises quel Prolog ?
    A la syntaxe près (Write en minuscule, pas de 'X dans le read), en SWI-Prolog, ça fonctionne bien.
    "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

Discussions similaires

  1. Réponses: 10
    Dernier message: 11/10/2010, 08h03
  2. CMake projet C/C++, problème de liens entre les fichiers
    Par LaMainSurLeKatana dans le forum C++
    Réponses: 1
    Dernier message: 16/08/2010, 15h53
  3. Réponses: 3
    Dernier message: 02/07/2010, 15h50
  4. [MySQL] Problème de liens entre les pages
    Par feldi dans le forum PHP & Base de données
    Réponses: 32
    Dernier message: 29/06/2010, 14h07
  5. lien entre les table de paradox
    Par salim_intic1 dans le forum Bases de données
    Réponses: 2
    Dernier message: 13/05/2004, 16h00

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