2011-09-06 34 views
5

Tôi đọc http://cs.union.edu/~striegnk/learn-prolog-now/html/node3.html#subsec.l1.kb1, nhưng tôi đang gặp khó khăn khi chạy các vị sau đây:vị Định nghĩa trong SICStus Prolog/SWI-Prolog REPL

SICStus 4.0.1 (x86-win32-nt-4): Tue May 15 21:17:49 WEST 2007 
| ?- woman(mia). 
! Existence error in user:woman/1 
! procedure user:woman/1 does not exist 
! goal: user:woman(mia) 
| ?- 

Nếu, mặt khác, tôi viết nó vào một tập tin và chạy tham khảo các tập tin, nó có vẻ làm việc tốt ...

Tôi chỉ được phép định nghĩa các vị từ trong một tệp có sau này để tham khảo chúng không? Tôi không thể làm điều đó trong trình soạn thảo chứ?

Trả lời

7

Bạn nên nhập woman(mia). vào tệp để xác nhận đó là sự thật. Nếu bạn viết nó vào trình thông dịch, nó được coi như một truy vấn, không phải là một sự kiện.

Từ SWI Prolog FAQ:

khoản mà bạn nhập vào mục cấp đầu là quá trình như truy vấn, trong khi thuật ngữ xuất hiện trong một tập tin được nạp vào Prolog được xử lý như một bộ quy tắc và sự kiện. Nếu một văn bản đọc như dưới đây, đây là một quy tắc.

carnivore(X) :- animal(X), eats_meat(X). 

Cố gắng nhập điều này vào kết quả to lớn trong lỗi bên dưới. Tại sao? Bởi vì một quy tắc là một thuật ngữ :-(Đầu, Nội dung) và bởi vì sự phức tạp diễn giải các thuật ngữ dưới dạng truy vấn. Không có biến vị ngữ nào có tên: - và hai đối số.

?- carnivore(X) :- animal(X), eats_meat(X). ERROR: Undefined 
procedure: (:-)/2 ERROR: Rules must be loaded from a file ERROR: 
See FAQ at http://www.swi-prolog.org/FAQ/ToplevelMode.txt 

Điều này thật ngu ngốc? Ồ không. Giả sử chúng ta có một thuật ngữ eats_meat (rataplan). Nếu điều này xuất hiện trong một tập tin, nó tuyên bố một thực tế rằng rataplan ăn thịt. Nếu nó xuất hiện ở mức cao, nó sẽ hỏi Prolog để thử chứng minh liệu con chuột có ăn thịt hay không.

Nếu một văn bản đọc

:- use_module(library(clpfd)). 

Đây là một chỉ thị. Các chỉ thị tương tự như các truy vấn, nhưng thay vì yêu cầu làm việc gì đó, họ yêu cầu trình biên dịch làm điều gì đó. Giống như các quy tắc và sự kiện, các thuật ngữ như vậy thuộc về các tệp.

Thay vì ghi vào một tệp, bạn cũng có thể sử dụng assert trong phần mở rộng (như được giải thích sau trong Câu hỏi thường gặp).

+1

Vì vậy, trong trường hợp này * khẳng định (phụ nữ (mia)) *. sẽ làm những gì tôi muốn? –

+0

@devoured: Có. – sepp2k

+1

Thông báo lỗi có thể gây nhầm lẫn cho người mới. Vì các quy tắc cũng có thể được tải từ người dùng, không chính xác là một tệp. Nhưng đây là một vấn đề chung của việc tạo ra các thông báo lỗi tốt. –

10

Đó là một chút khó chịu để làm cho các vị từ trong repl. Bạn có thể làm

| ?- ['user']. 
woman(mia). 
^D 

tức tham khảo ý kiến ​​người dùng nhập vào, hoặc

| ?- assertz(woman(mia)). 

khẳng định nó. Cả hai IMO vụng về - có thể có một cách tốt hơn, tuy nhiên, tôi chỉ không biết điều đó. Nói chung, việc sử dụng tập lệnh trở nên dễ dàng hơn.

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