2010-09-29 7 views
7

J'ai défini un fichier Prolog avec le code suivant:problème lorsque vous essayez de définir un opérateur dans Prolog

divisible(X, Y) :- 
    X mod Y =:= 0. 

divisibleBy(X, Y) :- 
    divisible(X, Y). 

op(35,xfx,divisibleBy). 

Prolog se plaint que

'$ record_clause'/2: Pas de permission pour modifier static_procedure `op/3 '

Qu'est-ce que je fais mal? Je veux définir un opérateur divisibleBy qui me permettra d'écrire le code comme suit:

4 divisibleBy 2 

Merci.

Répondre

14

Utilisez

:- op(35,xfx,divisibleBy). 

:- dit l'interprète Prolog à évaluer le prochain mandat lors du chargement du fichier, à savoir faire un appel prédicat, au lieu de le traiter comme une définition (dans ce cas, une redéfinition de op/3).

+2

Plus précisément, cela s'appelle "directive" plutôt que "appel de prédicat" ou "évaluation de prédicat". –

+0

Une priorité de 35 n'est définitivement pas conseillée pour ce prédicat. – false

2

Le answer given by @larsmans est parfait pour votre problème d'origine.

Toutefois, vous devez reconsidérer si vous devez définir un nouvel opérateur.

En général, je vous conseille vivement de ne pas définir de nouveaux opérateurs pour les raisons suivantes:

  • Le gain en lisibilité est souvent surestimée.
  • Il peut facilement introduire de nouveaux problèmes dans des endroits que vous n'attendriez pas normalement. Il ne «met pas à l'échelle» bien: un petit nombre d'opérateurs peut rendre le code sur les diapositives de présentation super concis, mais que se passe-t-il si vous ajoutez plus de cas de discrimination au fil du temps? Plus d'opérateurs?
+0

Quelques conseils supplémentaires: ** Si les opérateurs ** sont définis, ils doivent respecter les niveaux de priorité communs. Donc, si un prédicat est comme une comparaison, (je dirais que c'est l'exemple ici), il devrait prendre * exactiter * la priorité et la fixité de '(=)/2' qui est' op (700, xfx, =) ' . – false

Questions connexes