2012-05-19 4 views
2

J'ai un très grand nombre d'équations que j'essaie d'utiliser PROLOG pour résoudre. Cependant, je suis venu un mineur cropper en ce sens qu'ils ne sont pas spécifiés dans un ordre quelconque - c'est-à-dire, certaines, sinon beaucoup de variables, sont utilisées avant d'être définies. Ceux-ci sont tous spécifiés dans le même prédicat. PROLOG peut-il gérer les prédicats spécifiés dans un ordre aléatoire?Ordre de prédiction PROLOG

+1

Cela pourrait être utile légère - http://stackoverflow.com/questions/1425009/how-do-i-need-to-order-these-prolog-rules-so- i-can-run-my-program – ravi

Répondre

4

Absolument ... ni (en italien, Oui et Non)

C'est, idéalement Prolog exige que vous spécifiez ce que doit être calculé, non comment, écrivant les équations contrôler la solution sous une forme logique assez générale, Horn clauses.

Mais cet idéal est loin d'être atteint, et c'est le point où nous, en tant que programmeurs, jouons un rôle. Vous devriez essayer de trier topologiquement les formules, si vous voulez que Prolog applique des algorithmes/arithmétiques.

Mais à ce stade, Prolog n'est pas plus utile que tout autre langage procédural. Il est simplement plus facile de faire ce type topologique, en ce sens que les formules peuvent être read (ceci est un analyseur Prolog complet!), Des variables identifiées et quantifiées facilement, des termes transformés, évalués, etc. (caractéristiques des métaux, un point fort de Prolog).

La situation change si vous pouvez utiliser CLP(FD). Juste un exemple, un factoriel bidirectionnel (cool, non?), De la documentation de la mise en œuvre brillante qui Markus Triska développé pour SWI-Prolog:

You can also use CLP(FD) constraints as a more declarative alternative for ordinary integer arithmetic with is/2, >/2 etc. For example: 

:- use_module(library(clpfd)). 

n_factorial(0, 1). 
n_factorial(N, F) :- N #> 0, N1 #= N - 1, F #= N * F1, n_factorial(N1, F1). 

This predicate can be used in all directions. For example: 

?- n_factorial(47, F). 
F = 258623241511168180642964355153611979969197632389120000000000 ; 
false. 

?- n_factorial(N, 1). 
N = 0 ; 
N = 1 ; 
false. 

?- n_factorial(N, 3). 
false. 

To make the predicate terminate if any argument is instantiated, add the (implied) constraint F #\= 0 before the recursive call. Otherwise, the query n_factorial(N, 0) is the only non-terminating case of this kind. 

Ainsi, si vous écrivez vos équations dans CLP (FD) vous avez beaucoup plus de chances d'avoir votre «système d'équation» résolu tel quel. SWI-Prolog a un débogage dédié pour les détails de bas niveau utilisés pour résoudre CLP (FD).

HTH

+0

La bibliothèque n'inclut pas certains opérateurs dont j'ai besoin, principalement des opérateurs binaires. – Puppy

+0

Je pense que dans SWI-Prolog, la bibliothèque CLP (FD) a la plupart, sinon la totalité, des prédicats arithmétiques. Mais si vous en manquez un, je ne vois pas d'autre moyen que de réordonner les variables dans votre prédicat. – CapelliC