Bonjour à tous !
Voilà j'ai une base de faits qui est une liste de tâches:
Le prédicat a 4 argument, le premier est le nom de la tâche, le second la liste des prédécesseurs (tâches qui doivent être finies avant de pouvoir commencer celle-ci), le troisième la liste des successeurs (tâches pouvant être commencées quand celle-ci est finie), le quatrième représente la durée de la tâche.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 task(a, _, [b, f], 4). task(b, [a], [h], 13). task(c, _, [d], 4). task(d, [c], [h], 15). task(e, _, [g], 12). task(f, [a], [g], 4). task(g, [e, f], [i], 2). task(h, [b, d], [i], 2). task(i, [g, h], _, 2).
J'ai également un prédicat project qui contient une liste de toutes les tâches, project([a, b, c, d, e, f, g, h, i])
Dans la base de fait actuelle, A, C et E sont des tâches initiales, elles ont donc le 2ème argument vide. I est la tâche finale, le 3ème argument est vide.
Je récupère la durée de chaque tâche via :
Et via ce bout de code, j'arrive à afficher la liste des tâches, avec le début de chaque tâche le plus rapide.
Code : Sélectionner tout - Visualiser dans une fenêtre à part duree(A, D) :- activite(A, _, _, B), D is B.
Le soucis, c'est que la récursivité comptabilise a 2 fois, une fois par f et une fois par b. Je voudrais donc pouvoir obtenir une liste de tous les prédecesseurs d'une tâche ainsi que de ses propres prédécesseurs. Par exemple, pre(i, N) doit renvoyer [a, b, c ,d ,e ,f , g, h], pour le moment mon bout de code debut fait bien ça mais il y a du doublon :/
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 displayTaches :- taches(L), printListe(L). printListe([]). printListe([X|Liste]) :- debut(X, A), writeln(X: A), printListe(Liste). sumListe([], 0). sumListe([X|Liste], N) :- debut(X, Y), duree(X, Z), sumListe(Liste, Reste), N is Y + Z + Reste. debut(A, X) :- activite(A, L1, _, _), L1=[], X is 0; activite(A, L1, _, _), sumListe(L1, Y), X is Y.
Merci d'avance à quiconque pourra m'aiguiller !
Partager