2009-04-20 3 views
6

Je les deux faits chargés dans mon interprète Prolog:opérateur Prolog priorité et les règles correspondant à

foo(U+V,1). 
foo(U*V,2). 

Maintenant, j'essayer les prochaines requêtes avec qui résultats:

foo(x*x+x,R). --> R = 1 
foo(x+x*x,R). --> R = 1 
foo(x*x*x,R). --> R = 2 

Maintenant, j'essaie avec le demande suivante:

foo(x*x-x,R). --> no 

Comme je le comprends, ceci est expliqué par la façon dont la priorité de l'opérateur construit l'expression de l'arbre :

x+x*x --> +   so it matches with --> + 
     /\        /\ 
      x *        U V 
      /\ 
      x x 

x-x*x --> -   DOES NOT matches any fact. 
     /\        
      x *         
      /\ 
      x x 

Cette explication est-elle correcte?

Répondre

4

Oui, c'est correct.

La priorité d'opérateur par défaut est définie comme naturelle, c'est-à-dire qu'elle utilise la priorité mathématique normale. Mais si vous n'aimez pas cela, vous pouvez le redéfinir.

Si changer la priorité est une bonne idée est une autre affaire, il change effectivement la syntaxe de Prolog et peut conduire à des problèmes d'analyse. Surtout si vous modifiez la précédence des opérateurs pour la syntaxe Prolog, avec la précédence au-dessus de 1000.