2011-06-13 2 views
0

cette semaine j'ai eu ce devoir à faire: compter le grade des nœuds dans un graphe non orienté et tester s'il y a un chemin euler dedans. la fonction devrait fonctionner comme suit:Compteur de niveau Prolog et eulerpath

gradliste([[a,b],[b,c],[b,g],[c,d],[d,e],[e,f],[f,g],[g,h],[c,f]],X). 
X = [[a, 1], [b, 3], [c, 3], [g, 3], [d, 2], [e, 2], [f, 3], [h, 1]] 

testEulerweg([[a,b],[b,c],[c,d],[d,e],[a,e],[b,d],[b,e],[a,d]]). 
true. 

ma première idée de la fonction gradliste est de « fusion » du graphique et de générer une liste comme ceci: [a,b,b,c,b,g,c,d,d,e,e,f,f,g,g,h,c,f] alors je compte le nombre de chaque nœud. Malheureusement, j'ai collé au merge.

et pour la deuxième fonction testEulerweg je pense que je devrais tout d'abord écrire une fonction allconnected de travail comme suit:

allconnected([[a,b],[b,c],[c,d]]). 
true. 

allconnected([[a,b],[b,c],[e,f]]). 
False. 

alors je peux vérifier s'il y a aucun ou 2 noeuds avec le numéro de qualité impair en utilisant la fonction gradliste.

Quelqu'un peut-il m'aider sur mon idée? Je suis aussi ouvert à de nouvelles idées :)

merci à l'avance

bearzk

Répondre

0

La fonction merge est simple. Je vais le renommer flatten:

flatten([[X,Y] | Edges], [X,Y|Rest]) :- 
    flatten(Edges, Rest). 

Et je vais vous laisser écrire le scénario de base.

Pour trouver le chemin eulérien, consultez les algorithmes au Wikipedia. Le second peut être facilement mis en œuvre en termes de select/3, aussi longtemps que vous ne pasflatten la première liste :)

+0

Je ne sais pas encore comment tester si le chemin est le chemin eulérien, voulez-vous donner l'esprit moi plus de conseils? – bearzk