2012-02-25 33 views

Trả lời

13

Nếu hệ thống Prolog của bạn có trình gỡ lỗi có thể tùy chỉnh, bạn có thể dễ dàng viết mã thu thập đồ thị thời gian chạy của riêng bạn. Giả sử Hệ thống Prolog của bạn có một móc gọi lại là goal_tracing/2 như trong Jekejeke Prolog. Sau đó, chúng ta có thể tiếp tục và kiểm tra khung hiện tại và khung phụ huynh để tạo liên kết trong biểu đồ. Đây là mã số:

goal_tracing(call, F) :- 
    frame_property(F, sys_call_indicator(N, A)), 
    frame_property(F, sys_parent_frame(G)), 
    frame_property(G, sys_call_indicator(M, B)), 
    !, 
    update_link(N/A, M/B). 
goal_tracing(_, _). 

:- dynamic link/2. 
update_link(A, B) :- 
    link(A, B), 
    !. 
update_link(A, B) :- 
    assertz(link(A, B)). 

Có thể thấy chúng tôi chỉ kiểm tra cổng cuộc gọi và chỉ xem xét chỉ báo biến vị ngữ . Nhưng các cách tiếp cận khác cũng có thể thu thập được nhiều dữ liệu hơn. Bây giờ chúng ta cần một số tiện ích để hiển thị kết quả. Chỉ có reset để được gọi trước khi bộ sưu tập, và một chương trình được gọi sau khi bộ sưu tập:

reset :- 
    retract(link(_, _)), fail. 
reset. 

show :- 
    write('http://yuml.me/diagram/scruffy/class/'), 
    link(A, B), 
    write(([B] -> [A])), 
    write(', '), 
    fail. 
show. 

Chúng tôi sản xuất một liên kết mà được hiểu bởi yuml.me. Cho phép thử với chương trình giai thừa đậu phộng. Mã chương trình trông như sau:

add(n, X, X). 
add(s(X), Y, Z) :- 
    add(X, s(Y), Z). 

mul(n, _, n). 
mul(s(X), Y, Z) :- 
    mul(X, Y, H), 
    add(Y, H, Z). 

fac(n, s(n)). 
fac(s(X), Y) :- 
    fac(X, H), 
    mul(s(X), H, Y). 

Chúng tôi có thể chạy các nhà sưu tập như sau:

?- reset. 
?- trace. 
?- fac(s(s(n)),X). 
X = s(s(n)) 
?- nodebug. 
?- show. 
http://yuml.me/diagram/scruffy/class/[fac/2] -> [fac/2], [fac/2] -> [mul/3], [mul/3] -> [mul/3], [mul/3] -> [add/3], [add/3] -> [add/3], Yes 

Một sau đó có thể dán URL vào trình duyệt và sẽ xem sơ đồ. Xóa ", Có" ở cuối URL. Dưới đây là kết quả:

Call Graph

Trân trọng

+0

Bạn thật tuyệt vời. Tôi không có ý kiến. –

+0

Có lẽ một trong những câu trả lời hay nhất mà tôi từng đọc trên SO. Cảm ơn @ j4n bur53. – Will

+0

Ngày một chút, mục tiêu frame_property/2 cần nâng cấp. –

2

Cây tìm kiếm Prolog thường chỉ đơn giản là quá lớn để được kiểm tra từng bước, nhưng vẽ một cái có thể khá đơn giản và thú vị nữa. Có lẽ tôi sẽ cố gắng viết một bằng cách sử dụng thư viện html_write. Trong trường hợp đó, tôi sẽ báo cáo kết quả.

Trong khi chờ đợi, SWI-Prolog có một đại diện khá đặc biệt trong trình gỡ lỗi của nó. Có những chi tiết thú vị về cây chương trình Prolog. Nó không phải là dễ sử dụng và tôi phải thú nhận tôi vẫn chưa đọc tài liệu. Tuy nhiên tôi đã sử dụng trình gỡ lỗi thường xuyên. Bạn có thể điều hướng cây và các biến được tạo ra trên các nút khác nhau. Đó là mạnh mẽ.

Trực quan hóa không gian tìm kiếm Prolog là một nhiệm vụ thú vị không đơn giản!

chỉnh sửa Tôi quên đề cập đến rằng XPCE có khả năng hiển thị các cây lớn. Nếu bạn đã cây chứng minh, hiển thị nó sẽ rất dễ dàng. Chỉ cần mở trình xem. Nên có một số ví dụ trong trợ giúp thủ công XPCE. Bạn có thể căn cứ hiển thị trên đó.

+0

@Robert Oschler: cảm ơn rất nhiều để sửa bài xấu bày tỏ của tôi. Nó rất thú vị, mặc dù, tôi sợ hãi, tôi sẽ tiếp tục thể hiện rất kém. Nhưng tôi đánh giá cao. – CapelliC

+0

Niềm vui của tôi, đặc biệt là vì thông tin chứa đựng là quan trọng. Ngoài ra, xin chào từ một fan hâm mộ Prolog đồng nghiệp! –

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