2010-09-29 22 views
7

Ich habe eine Prolog-Datei mit dem folgenden Code definiert:Problem, wenn ein Operator in Prolog zu definieren versuchen

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

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

op(35,xfx,divisibleBy). 

Prolog reklamiert und

'$ record_clause'/2: Keine Erlaubnis modify static_procedure `op/3 '

Was mache ich falsch? Ich möchte einen DivisibleBy-Operator definieren, der es mir ermöglicht, einen Code wie den folgenden zu schreiben:

4 divisibleBy 2 

Danke.

Antwort

14

Verwenden

:- op(35,xfx,divisibleBy). 

:- sagt der Prolog-Interpreter die nächste Wahlperiode zu bewerten, während das Laden der Datei, also ein Prädikat Anruf tätigen, anstatt sie als eine Definition der Behandlung (in diesem Fall eine Neudefinition von op/3).

+2

Genauer gesagt, das heißt "Direktive" und nicht "Prädikatenaufruf" oder "Prädikatauswertung". –

+0

Eine Priorität von 35 ist für dieses Prädikat definitiv nicht ratsam. – false

2

Die answer given by @larsmans ist genau in Bezug auf Ihr ursprüngliches Problem.

Sie sollten jedoch überdenken, wenn Sie einen neuen Operator definieren sollten.

Im Allgemeinen würde ich dringend abraten Definition neue Betreiber aus den folgenden Gründen:

  • Der Gewinn an Lesbarkeit oft überschätzt wird.
  • Es kann leicht zu neuen Problemen an Stellen führen, an denen Sie normalerweise keinen Buggy erwarten würden.
  • Es "skaliert" nicht gut: eine kleine Anzahl von Operatoren kann Code auf Präsentationsfolien superpräzise gestalten, aber was ist, wenn Sie im Laufe der Zeit mehr Gewerkschaftsfälle diskriminieren? Mehr Betreiber?
+0

Noch ein Hinweis: ** Wenn ** Operatoren definiert sind, sollten sie die gemeinsamen Prioritätsstufen einhalten. Wenn also ein Prädikat wie ein Vergleich ist (ich würde sagen, das ist hier das Beispiel), sollte es * exciteriter * die Priorität und die Festigkeit von '(=)/2 'nehmen, was' op (700, xfx, =) 'ist . – false

Verwandte Themen