2015-06-17 74 views
13

在舊課本一個經常遇到運營商的聲明如下所示:爲什麼高優先級操作符的原子不需要圓括號?

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

使用這些圓括弧是必要的。但今天,他們不再需要:

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

他們爲什麼不再需要?標準如何應對這種情況?


第97頁MU-的Prolog3.2分貝參考手冊6.標準運算符聲明由Lee納什,LNCS 238,施普林格出版社1985年

回答

6

op(1200,fx,:-)是功能符號中的複合術語。

引用6.3.3化合物而言---函數符號

寫入功能表示法的化合物,術語具有如下形式f(A1,...,An)其中每個參數AiARG ,並且它們通過分離,(逗號)。

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

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

引用6.3.3.1參數

的參數(由ARG中的語法規則表示)發生作爲參數複合術語或元素列表的nt。它可以是一個原子是一個操作符,或者與優先級的術語不大於999

arg = atom;如果原子是操作者(具有任意的優先級)
arg = term;(具有優先級999)

由於以上突出顯示的情況arg = atom;:-不需要在op(1200,fx,:-)中的圓括號。

如果不是以上特例,我們需要圓括號,因爲推導必須遵循6.3.1。3個原子

term = atom;優先級爲0,如果原子不是操作者
term = atom;優先1201,如果原子是一個運算符。


6

出現在否定與控制的Prolog以下全部涉及ISO/IEC 13211-1:1995。 讓我動內而外......

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 ; 

所以我們再回到最初的問題:

使用這些圓括弧是必要的。但今天,他們不再需要。爲什麼他們不再需要?標準如何應對這種情況?

我們假設T = op(1200,fx,:-)成立。

  1. T是以功能符號提供的複合術語。

  2. T由上述規則覆蓋term = atom, open ct, arg list, close;

  3. ​​op匹配,這是T函子。

  4. open ct匹配一個開放的括號。

  5. 「中間部分」(T的參數)由arg list的語法規則覆蓋。

  6. arg listarg的非空列表。

  7. 什麼是arg

    • 優先級小於1000的術語,(',')/ 2的優先級。例如,1200fx

    • 作爲操作員的原子。 (不附帶任何條紋!)

  8. 與結束括號近似匹配。

引用:

的參數(由arg中的語法規則表示發生爲列表的compount術語或元件的自變量它可以是一個原子,其是一個操作符,或。一個優先級不超過999的術語。當參數是一個任意的術語時,它的優先級應該小於','(逗號)運算符的優先級,這樣在作爲中綴運算符的逗號和作爲逗號的逗號之間沒有衝突參數或列表元素分隔符

注:

一個「說法」的概念,保證了這兩個詞f(x,y)f(:-, ;, [:-, :-|:-])在語法上是有效的任何運營商定義當前定義。逗號不是原子,下列「術語」具有語法錯誤:f(,,a)[a,,|v][a,b|,];但以下兩個術語在語法上有效:f(',',a),[a,','|v][a,b|',']