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.
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 :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
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)11 ?- accessible(case(1,1,0),C).
C = case(1, 2, 0)
Yes
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 :
J'ai essayé de minimiser en notant :
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)).
Ca donne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part lien(case(1,1,X),case(1,2,0)):- X=0; X=h.
Et pourtant15 ?- 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
La ligne de code :11 ?- accessible(case(1,1,0),C).
C = case(1, 2, 0)
Yes
Merci de me fournir une petite aide, c'est la première fois que je touche au PROLOG.
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 ),
Partager