2010-09-29 20 views
7

he definido un archivo de prólogo con el siguiente código:problema cuando se trata de definir un operador en Prolog

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

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

op(35,xfx,divisibleBy). 

Prolog se queja de que

'$ record_clause'/2: No tiene permiso para modificar static_procedure `op/3 '

¿Qué estoy haciendo mal? Quiero definir un operador divisibleBy que me permita escribir código como el siguiente:

4 divisibleBy 2 

Thanks.

Respuesta

14

Uso

:- op(35,xfx,divisibleBy). 

:- le dice al intérprete de Prolog a evaluar el próximo mandato mientras se carga el archivo, es decir, hacer una llamada predicado, en lugar de tratarla como una definición (en este caso una redefinición de op/3)

+2

Más precisamente, eso se llama "directiva" en lugar de "llamada de predicado" o "evaluación de predicados". –

+0

Una prioridad de 35 definitivamente no es recomendable para este predicado. – false

2

El answer given by @larsmans es perfecto para su problema original.

Sin embargo, debe reconsiderar si debe definir un nuevo operador.

En general, yo aconsejaría fuertemente contra la definición de nuevos operadores por las siguientes razones:

  • La ganancia en la legibilidad es a menudo sobrevalorado.
  • Puede presentar fácilmente nuevos problemas en lugares que normalmente no esperarían con errores.
  • No "escala" bien: un pequeño número de operadores puede hacer que el código en las diapositivas de presentación sea súper conciso, pero ¿qué sucede si agrega más casos de discriminación en el tiempo? Más operadores?
+0

Algunos consejos más: ** Si se definen los operadores **, deben respetar los niveles de prioridad comunes. Entonces, si un predicado es como una comparación (diría que ese es el ejemplo aquí), debería tomar * exactiter * la prioridad y la fijeza de '(=)/2' que es' op (700, xfx, =) ' . – false

Cuestiones relacionadas