2015-06-17 17 views
13

Trong sách giáo khoa cũ một thường xuyên gặp tờ khai hành như sau:Tại sao các dấu ngoặc tròn không cần thiết cho các nguyên tử là các toán tử ưu tiên cao?

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

Những dấu ngoặc tròn sử dụng là cần thiết. Nhưng hôm nay, chúng không còn cần thiết nữa:

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

Tại sao chúng không còn cần thiết nữa? Tiêu chuẩn này đối phó với tình huống này như thế nào?


p.97 6. Tiêu chuẩn vận hành khai báo tham chiếu 3.2db thủ MU-Prolog, xuất hiện trong Phủ định và kiểm soát trong Prolog Lee Naish, LNCS 238, Springer-Verlag năm 1985.

Trả lời

6

op(1200,fx,:-) là một thuật ngữ ghép trong ký pháp chức năng.

Trích dẫn 6.3.3 về Compound --- ký hiệu chức năng:

Một thuật ngữ hợp chất viết bằng ký hiệu chức năng có dạng f(A1,...,An) nơi mỗi đối số Ai là một arg và họ được ngăn cách bởi , (dấu phẩy).

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

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

Trích dẫn 6.3.3.1 Arguments:

Một cuộc tranh cãi (đại diện bởi arg trong các quy tắc cú pháp) xảy ra như là đối số của một thuật ngữ phức hợp hoặc eleme nt của một danh sách. Nó có thể là một nguyên tử mà là một nhà điều hành, hoặc một thuật ngữ ưu tiên không lớn hơn 999.

arg = atom; nếu nguyên tử là một nhà điều hành (ưu tiên tùy ý)
arg = term; (ưu tiên 999)

Do trường hợp được đánh dấu ở trên arg = atom;, :- không cần dấu ngoặc tròn trong op(1200,fx,:-).

Nếu không có trường hợp đặc biệt trên, chúng tôi sẽ cần dấu ngoặc tròn, vì dẫn xuất sẽ phải theo dõi 6.3.1.3 Atoms:

term = atom; với ưu tiên 0, nếu nguyên tử không phải là một nhà điều hành
term = atom; với ưu tiên 1201, nếu nguyên tử là một nhà điều hành.


6

Tất cả những điều sau đây đề cập đến ISO/IEC 13211-1: 1995. Hãy để tôi di chuyển từ trong ra ngoài ...

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 ; 

Vì vậy, chúng ta trở lại với câu hỏi ban đầu:

Những dấu ngoặc tròn sử dụng là cần thiết. Nhưng hôm nay, họ không còn cần thiết nữa. Tại sao họ không còn cần thiết nữa? Tiêu chuẩn này đối phó với tình huống này như thế nào?

Giả sử T = op(1200,fx,:-) giữ.

  1. T là một thuật ngữ phức hợp được cung cấp trong ký pháp chức năng.

  2. T được bao phủ bởi quy tắc trên term = atom, open ct, arg list, close;

  3. atom trận op, đó là functor của T.

  4. ct mở khớp với một khung mở.

  5. "phần giữa" (đối số của T) được đề cập trong các quy tắc ngữ pháp cho arg list.

  6. arg list là danh sách không rỗng là arg.

  7. Có gì arg?

    • cụm từ có mức độ ưu tiên nhỏ hơn 1000, mức độ ưu tiên (',')/2. Ví dụ: 1200fx.

    • nguyên tử là toán tử. (Không có chuỗi nào được đính kèm!)

  8. đóng phù hợp với khung đóng.

Trích dẫn:

Một cuộc tranh cãi (đại diện bởi arg trong các quy tắc cú pháp xảy ra như là đối số của một thuật ngữ compount hoặc yếu tố của một danh sách Nó có thể là một nguyên tử mà là một nhà điều hành, hoặc. một đối số có mức ưu tiên không lớn hơn 999. Khi đối số là một thuật ngữ tùy ý, mức ưu tiên của nó phải nhỏ hơn mức ưu tiên của toán tử ',' (dấu phẩy) sao cho không có xung đột giữa dấu phẩy. bộ tách phần tử đối số hoặc danh sách.

Lưu ý:

này khái niệm của một "lý luận" đảm bảo rằng cả hai điều khoản f(x,y)f(:-, ;, [:-, :-|:-]) là cú pháp hợp lệ định nghĩa bất cứ điều hành hiện được xác định. Dấu phẩy không phải là nguyên tử và "các cụm từ" sau có lỗi cú pháp: f(,,a), [a,,|v][a,b|,]; nhưng hai thuật ngữ sau đây có hiệu lực về cú pháp: f(',',a), [a,','|v][a,b|','].

Các vấn đề liên quan