2011-09-13 34 views
17

Đối với tiếng leng keng, tôi đã bắt đầu học Prolog qua http://www.learnprolognow.org/. Lý do của tôi là tôi chỉ có chỉ cần bắt đầu.Cảnh báo vị ngữ không liên tục từ GNU Prolog

Tôi không chắc cách thực hiện bài tập (đơn giản?) Sau đây để làm việc như mong đợi. http://cs.union.edu/~striegnk/learn-prolog-now/html/node13.html#sec.l1.exercises

Tôi có thể thấy rằng Gnu Prolog 1.4 (http://www.gprolog.org/) không hài lòng khi vị từ thứ 2 cho thuật sĩ \ 1 không nằm bên cạnh vị trí đầu tiên. Tôi có thể sắp xếp lại chương trình để làm cho nó hoạt động nhưng sau đó tôi kết thúc với mã mà mắt mới của tôi Prolog là ít dễ hiểu hơn so với cái được trình bày dưới đây.

Tôi có thiếu thứ gì đó hiển nhiên không?

wiz.pl

wizard(ron). 
hasWand(harry). 
quidditchPlayer(harry). 

wizard(X) :- hasBroom(X),hasWand(X). 
hasBroom(X) :- quidditchPlayer(X). 

tham khảo ý kiến ​​wiz.pl

| ?- [wiz]. 
compiling D:/wiz.pl for byte code... 
D:/wiz.pl:5: warning: discontiguous predicate wizard/1 - clause ignored 
D:/wiz.pl compiled, 5 lines read - 632 bytes written, 24 ms 

Trả lời

19

Hầu hết Prologs muốn các điều khoản cho bất kỳ vị cụ thể được liệt kê với nhau, trừ khi bạn làm một số phép thuật. Tôi ngạc nhiên khi Striegnitz và Bos phớt lờ điều này. Thay đổi chương trình thành

% all clauses for wizard/1 
wizard(ron). 
wizard(X) :- hasBroom(X),hasWand(X). 

hasWand(harry). 
quidditchPlayer(harry). 
hasBroom(X) :- quidditchPlayer(X). 

Lưu ý rằng tôi đã giữ các điều khoản cho wizard/1 theo thứ tự như trong chương trình gốc. Đối với các cơ sở tri thức đơn giản như thế này, thứ tự không quan trọng lắm, nhưng khi thực hiện các thuật toán không xác định, thứ tự điều khoản có thể xác định thứ tự trong đó các giải pháp được tạo ra.

+1

ok cảm ơn, tôi đã ngây thơ cho rằng sự kiện sẽ được giữ lại với nhau và sau đó các quy tắc xuất phát . Tôi sẽ lưu ý của bạn về thứ tự trong đầu. Tôi cũng sẽ gửi thư cho các tác giả để nhận xét. –

+1

@AdamStraughan Họ đã từng phản hồi chưa? –

+0

@DanielLyons, tôi không thể nhớ, tìm kiếm email của tôi không tìm thấy gì cả. Xin lỗi tôi không thể giúp nhiều hơn. –

6

Có một ISO Prolog discontiguous chỉ thị mà bạn có thể sử dụng để thư giãn yêu cầu này cho một vị cụ thể:

http://www.gprolog.org/manual/gprolog.html#htoc53

+0

Điều này là hữu ích, nhưng tôi đã đấu tranh để tìm ra CÁCH để sử dụng chỉ thị. Tôi đang sử dụng cùng một tài liệu học tập như OP và tôi đã khám phá cách sử dụng chỉ thị trong mã nguồn của bạn để khắc phục sự cố. Đơn giản chỉ cần sử dụng điều này: –

+0

Bằng cách nào đó tôi đã bỏ lỡ cửa sổ để chỉnh sửa - chỉ cần thêm phần này vào đầu cơ sở kiến ​​thức của bạn: ': -discontiguous (wizard/1) .' –

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