2013-03-18 26 views
7

Các thuật ngữ Hilog (tức là các hợp chất có thuật ngữ tùy ý functors) vẫn được coi là một tính năng mạnh mẽ trong XSB Prolog (hay bất kỳ Prolog nào khác)? Có nhiều dự án XSB hiện đang sử dụng tính năng này không? cái nào trong số đó chẳng hạn?Các thuật ngữ Hilog trong (XSB) Prolog

Tôi hỏi kể từ khi tôi hiểu chương trình bậc cao hơn cũng có thể bằng cách sử dụng lệnh gọi ISO/N tích hợp sẵn.

Cụ thể, tôi muốn hiểu nếu XSB đang sử dụng thuật ngữ Hilog chỉ vì lý do lịch sử hoặc nếu điều khoản Hilog có lợi thế đáng kể so với tiêu chuẩn ISO hiện hành.

Trả lời

5

Trong vòng XSB, thuật ngữ Hilog được kết nối rất mạnh với hệ thống mô-đun duy nhất cho XSB. XSB có một hệ thống mô đun dựa trên functor. Tức là, trong cùng phạm vi length(X) có thể thuộc về một mô-đun, trong khi length(L, N) có thể thuộc về một mô-đun khác. Kết quả là, call(length(L), N) có thể tham khảo một mô-đun và call(length(L, N)) khác:

[Patch date: 2013/02/20 06:17:59] 
| ?- use_module(basics,length/2). 
yes 
| ?- length(Xs,2).    
Xs = [_h201,_h203] 
yes 
| ?- call(length(Xs),2). 
Xs = [_h217,_h219] 
yes 
| ?- use_module(inex,length/1). 
yes 
| ?- length(Xs,2). 
Xs = [_h201,_h203] 
yes 
| ?- call(length(Xs),2). 
++Error[XSB/Runtime/P]: [Existence (No module inex exists)] in arg 1 of predicate load 
| ?- call(call(length,Xs),2). 
Xs = [_h228,_h230]; 

Nó có thể là trong một bối cảnh như vậy có sự khác biệt giữa call/N và Hilog điều khoản. Tôi có, tuy nhiên, cho đến nay không tìm thấy một.

Trước đây, các thuật ngữ Hilog đã được giới thiệu 1987-1989. Tại thời điểm đó, call/N đã tồn tại như được xây dựng trong NU và là library(call) trong Quintus Prolog với only cursory documentation. Nó đã được đề xuất 1984 by Richard O'Keefe. Mặt khác, call/N rõ ràng không được biết đến với các tác giả của Hilog, như được minh họa trên p.1101 của Weidong Chen, Michael Kifer, David Scott Warren: HiLog: Một thứ tự đầu tiên ngữ nghĩa để lập trình logic bậc cao. NACLP 1989. 1090-1114. MIT-Press.

... đóng bắc cầu Generic cũng có thể được định nghĩa trong Prolog:

closure(R, X, Y) :- C =.. [R, X, Y], call(C). 
    closure(R, X, Y) :- C =.. [R, X, Z], call(C), closure(R, Z, Y). 

Tuy nhiên, điều này rõ ràng là không thanh nha so với HiLog (xem mục 2.1), vì điều này liên quan đến cả hai xây dựng một thuật ngữ ra khỏi một danh sách và phản ánh thuật ngữ này thành một công thức nguyên tử bằng cách sử dụng "gọi". Điểm của ví dụ này là việc thiếu cơ sở lý thuyết cho các cấu trúc bậc cao trong Prolog dẫn đến một cú pháp tối nghĩa, một phần giải thích tại sao các chương trình Prolog liên quan đến các cấu trúc như vậy khó hiểu.

Bây giờ, điều này có thể được thực hiện với call/N như vậy:

closure(R, X, Y) :- call(R, X, Y). 
closure(R, X, Y) :- call(R, X, Z), closure(R, Z, Y). 

Đó là thậm chí tổng quát hơn so với (=..)/2 -version vì R không còn bị hạn chế để trở thành một nguyên tử. Ngoài ra, tôi muốn viết:

closure(R_2, X0,X) :- call(R_2, X0,X1), closure0(R_2, X1,X). 

closure0(_R_2, X,X). 
closure0(R_2, X0,X) :- call(R_2, X0,X1), closure0(R_2, X1,X). 
Các vấn đề liên quan