2015-03-06 18 views

Trả lời

0

Biểu tượng --> được sử dụng trong việc triển khai nhiều Prolog để tạo Declarative khoản Grammar (DCG) quy tắc, mà mang hình thức:

head --> body. 

như tương tự như quy tắc Prolog bình thường:

head :- body. 

Trong thực tế, mọi quy tắc DCG đều có thể được dịch thành một quy tắc Prolog bình thường (và bên trong), nhưng cú pháp DCG đóng vai trò là viết tắt thuận tiện và rất mạnh mẽ để tạo các quy tắc liên kết danh sách với nhiều cấu trúc Prolog khác nhau. Thường thì các quy tắc DCG được sử dụng cho mục đích phân tích cú pháp danh sách khá hạn chế.

Câu hỏi đặt ra ở đây là đưa ra một ví dụ đơn giản về việc sử dụng -->, nói cách khác cho thấy các quy tắc DCG hoạt động như thế nào trong một trường hợp đơn giản. Người đứng đầu quy tắc DCG có hiệu quả là một vị từ của quy tắc Prolog cơ bản với hai đối số phụ đại diện cho danh sách chênh lệch , cụ thể là một danh sách được biểu thị dưới dạng danh sách dài hơn trừ đi một số phần sau của danh sách dài hơn đó.

Dưới đây là một ví dụ DCG lấy từ SWI-Prolog DCG tutorial thích nghi bởi Ann Ogborn từ hướng dẫn bởi Markus Triska given in Boris's Comment:

as --> [ ].   % empty list is okay 
as --> [a], as.  % list [a|T] is okay iff T is okay 

Để phân biệt này từ một vị Prolog bình thường chúng ta biểu thị as//0 này, nhưng nó tương đương với một vị ngữ Prolog bình thường với hai đối số bổ sung. Chúng ta có thể truy vấn cơ bản Prolog vị trực tiếp bằng cách cung cấp hai đối số thêm:

?- as([ ],[ ]). 
true 

này thành công vì sự khác biệt giữa hai danh sách (mà lại là một danh sách trống) được chấp nhận theo as//0. Ngoài ra:

?- as([a],[ ]). 
true 

thành công vì sự khác biệt giữa hai danh sách là [a], đó là ổn bởi đệ quy với as//0.

Một cách khác để sử dụng as//0 là với thuộc tính Prolog được tích hợp phrase/2, lấy tham số đầu tiên là đầu DCG và làm đối số thứ hai trong danh sách. Trong trường hợp này phrase/2 sẽ tạo ra danh sách đáp ứng as//0:

?- phrase(as, Ls). 
Ls = '[]' ; 
Ls = [a] ; 
Ls = [a, a] ; 
Ls = [a, a, a] ; 

và như vậy, cho đến khi bạn chấm dứt việc truy vấn thành công bằng cách nhấn trở lại.

Ví dụ này cũng hoạt động với Amzi! Prolog với chỉ khác biệt nhỏ trong đầu ra.

+1

Bạn đang phần nào gợi ý rằng 'cụm từ/2'" sẽ tạo danh sách ". Nhưng nó không ; không nhiều hơn, không ít hơn gọi là mở rộng trực tiếp. Thay vào đó, 'cụm từ/2' xác định giao diện, trong khi một mục tiêu như' (Ls, []) 'phá vỡ nó. – false

+0

@false: Cảm ơn bạn đã chỉ ra sự diễn giải sai có thể xảy ra. Tôi có nghĩa là chỉ có một cách khác để gọi mục tiêu, đưa ra một ràng buộc với biến 'Ls' trong trường hợp này có thể hữu ích khi chuyển sang một vị từ khác, không phải là nó tạo ra các danh sách bất kỳ cách nào khác với backtracking bình thường. – hardmath

+1

Tôi muốn nói: Thả hoàn toàn cuộc gọi nội bộ. – false

4

hardmath đã giải thích rất nhiều. Nhưng điều hấp dẫn hơn về DCG là, mặc dù cú pháp ->/2 gợi ý ngữ pháp tự do ngữ cảnh, nhưng thực tế nó lại nhiều hơn. Người ta cũng có thể lập mô hình các ngôn ngữ phức tạp hơn nhờ các thuộc tính, đó là các tham số đơn giản cho các thiết bị không phải là thiết bị đầu cuối.

Đây là DCG tạo và chấp nhận ngôn ngữ L = {a^n b^n c^n}.DCG đọc như sau:

:- use_module(library(clpfd)). 

start(N) --> as(N), bs(N), cs(N). 

as(N) --> {N #> 0, M #= N-1}, [a], as(M). 
as(0) --> []. 

bs(N) --> {N #> 0, M #= N-1}, [b], bs(M). 
bs(0) --> []. 

cs(N) --> {N #> 0, M #= N-1}, [c], cs(M). 
cs(0) --> []. 

Mã trên sử dụng điều kiện phụ được gọi là (*), chấp nhận bởi {}, đây là mã bình thường xen vào DCG. Và để cho phép sử dụng hai chiều DCG, chúng tôi đã sử dụng CLP (FD) thay vì số học thông thường. Dưới đây là một số ví dụ chạy trong SWI-Prolog:

?- phrase(start(X),[a,a,a,b,b,b,c,c,c]). 
X = 3 
?- phrase(start(3),Y). 
Y = [a,a,a,b,b,b,c,c,c] 

Nhưng trong thực tế, DCG cũng thường được tìm thấy do khả năng vượt qua trạng thái. Họ cho phép một hình thức của monads trong Prolog. Chỉ cần thay thế danh sách đầu vào và danh sách đầu ra với trạng thái đầu vào và trạng thái đầu ra.

Bye

(*) Một giấy đầu thúc đẩy DCG là:

Pereira, F.C.N. và Warren, D.H.D. (1980):
ngữ pháp khoản Definite Phân tích ngôn ngữ -
Một khảo sát của Chủ nghĩa hình thức và so sánh với
Augmented chuyển Networks, Bắc-Holland
Publishing Company, Trí tuệ nhân tạo, 13, 231-278

http://cgi.di.uoa.gr/~takis/pereira-warren.pdf

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