2012-01-05 2 views
2

J'écris une règle qui recherche une base de données de faits sous la forme:Quelle est la pratique la plus courante dans Prolog?

overground(Station1, Station2, DurationOfTravel). 

et permet de vous rechercher tous les voyages qui ont la même durée de Voyage.

J'ai écrit ces deux règles:

timesearch(Duration) :- 
    overground(Station1, Station2, Duration), 
    print([Station1, Station2]). 

timesearch(Duration, [Station1,Station2]) :- 
    overground(Station1, Station2, Duration). 

qui font essentiellement la même chose. Ce dont je ne suis pas sûr, c'est quelle est la meilleure pratique? Ou sont-ils deux solutions tout aussi bonnes?

Répondre

6

Ils ne font pas essentiellement la même chose; ils contiennent la même logique "business", mais le premier se mélange dans la logique de présentation (code de sortie). C'est un principe général de conception de programme que la logique métier et la présentation doivent être séparées, donc allez avec la deuxième option et mettez l'impression dans une sorte de prédicat main.

En particulier, dans cet exemple, vous ne souhaitez pas que l'impression soit effectuée dans le prédicat timesearch; Que faire si vous décidez un jour que vous voulez un algorithme plus compliqué qui peut déterminer la durée d'un itinéraire de plus de deux sauts? Vous pouvez implémenter un tel algorithme en termes de la deuxième définition de timesearch, mais pas en termes de la première.

(Cela a très peu à voir avec Prolog et d'autant plus avec l'art de la conception de logiciels.)

2

En plus de la réponse de @larsmans, je voudrais ajouter un lien à propos pure functions. Dans toutes les langues où vous avez la possibilité d'appliquer ce concept, préférez les fonctions pures si possible et manipulez les E/S dans des parties séparées.

Surtout ici en prologue, lorsque le backtracking est nécessaire, le fait de sortir des choses dans vos prédicats de logique applicative peut s'avérer très problématique, car ces choses peuvent être imprimées lors de l'exécution d'une branche qui ne mènera pas à un résultat.

Questions connexes