2015-06-17 22 views
13

Nel testo anziane si incontrano frequentemente dichiarazioni dell'esercente come la seguente:Perché le parentesi tonde non sono necessarie per gli atomi che sono operatori con priorità alta?

?- op(1200,fx,(:-)). 
      ^^ 

Queste parentesi tonde utilizzati siano necessarie. Ma oggi non sono più necessari:

| ?- writeq(op(1200,fx,(:-))).  
op(1200,fx,:-) 

Perché non sono più necessari? In che modo lo standard fa fronte a questa situazione?


p.97 6. operatore dichiarazioni standard di manuale di riferimento 3.2db MU-Prolog, che appaiono nelle Negazione e Controllo in Prolog da Lee Naish, LNCS 238, Springer-Verlag 1985.

risposta

6

op(1200,fx,:-) è un termine composto in notazione funzionale.

Citando 6.3.3 termini composti --- notazione funzionale:

Un termine composto scritto in notazione funzionale ha la forma f(A1,...,An) dove ogni argomento Ai è un arg e sono separate da , (virgola).

term = atom, open ct, arg list, close;

arg list = arg;
arg list = arg, comma, arg list;

citare 6.3.3.1 Argomenti:

Un argomento (rappresentanti arg nelle regole sintattiche) si verifica come argomento di un termine composto o eleme nt di una lista. Può essere un atomo che è un operatore, oppure un termine con priorità non superiore a 999.

arg = atom; se atomo è un operatore (con priorità arbitraria)
arg = term; (con priorità 999)

A causa del caso sopra evidenziato arg = atom;, :- non è necessario utilizzare staffe rotonde in op(1200,fx,:-).

Se non fosse per caso speciale sopra, abbiamo vorrebbe parentesi tonde, come la derivazione dovrebbe seguire 6.3.1.3 atomi:

term = atom; con priorità 0, se atomo non è un operatore
term = atom; con priorità 1201, se atomo è un operatore.


6

Tutto quanto segue si riferisce a ISO/IEC 13211-1: 1995. Lasciatemi muovo dentro e fuori ...

6.5.1  graphic char  = ":"; 
      graphic char  = "-"; 

6.4.2  graphic token char = graphic char; 

      graphic token  = graphic token char, { graphic token char }; 

      name token   = graphic token; 

6.4  name    = [ layout text sequence (* 6.4.1 *) ], name token; 

6.3.1.3 atom    = name; 

6.5.3  open char   = "("; 
      close char   = ")"; 
      comma char   = ","; 

6.4.8  open token  = open char; 
      close token  = close char; 
      comma token  = comma char; 

6.4.1  (* grammar rules for layout text sequence were omitted *) 

6.4  comma    = comma token; 
      open ct   = open token; 
      close    = [ layout text sequence ], close token; 

6.3.3.1 arg    = atom; (* if that atom is an operator *) 
      arg    = term; (* otherwise: priority = 999 *) 

6.3.3  arg list   = arg; 
      arg list   = arg, comma, arg list; 

6.3.3  term    = atom, open ct, arg list, close ; 

Così torniamo alla domanda iniziale:

Queste parentesi tonde usato essere necessario. Ma oggi non sono più necessari. Perché non sono più necessari? In che modo lo standard fa fronte a questa situazione?

Supponiamo che T = op(1200,fx,:-) resti.

  1. T è un termine composto disponibile in notazione funzionale.

  2. T è coperto dalla regola sopra term = atom, open ct, arg list, close;

  3. atom partite op, che è il funtore di T.

  4. open ct corrisponde a una parentesi aperta.

  5. la "parte centrale" (gli argomenti di T) è coperto dalle regole grammaticali per arg list.

  6. arg list è un elenco non vuoto di arg.

  7. Che cos'è arg?

    • un termine con priorità inferiore a 1000, la priorità di (',')/2. Ad es., 1200 e fx.

    • un atomo che è un operatore. (Nessuna stringa allegata!)

  8. chiudere corrisponde a una parentesi di chiusura.

quotazioni:

Un argomento (rappresentanti arg nelle regole sintattiche avviene come argomento di un termine composti ai o elemento di un elenco Può essere un atomo che è un operatore, o. un termine con priorità non superiore a 999. Quando un argomento è un termine arbitrario, la sua priorità deve essere inferiore alla priorità dell'operatore ',' (virgola) in modo che non vi sia conflitto tra virgola come operatore infisso e virgola come argomento o elenco separatore di elementi

Nota:

Questa concetto di "argomento" garantisce che sia i termini f(x,y) e f(:-, ;, [:-, :-|:-]) sono sintatticamente valido definizioni qualunque operatore sono attualmente definite. Virgola non è un atomo e i seguenti "termini" hanno errori di sintassi: f(,,a), [a,,|v] e [a,b|,]; ma i seguenti due termini sono sintatticamente validi: f(',',a), [a,','|v] e [a,b|','].

Problemi correlati