2013-05-04 44 views
18

Tôi có đoạn mã này:Prolog: khoản không cùng nhau trong nguồn tập tin

% Family tree 
female(pen). 
male(tom). 
male(bob). 
female(liz). 
female(pat). 
female(ann). 
male(jim). 

parent(pam, bob). 
parent(tom, bob). 
parent(tom, liz). 
parent(bob, ann). 
parent(bob, pat). 
parent(pat, jim). 

tôi nhận được lỗi này:

Warning: Clauses of female/1 are not together in source-file 
Warning: Clauses of male/1 are not together in source-file 

mục đích của lỗi này là gì?
Ý tôi là, tệp không biên dịch và chạy tốt và tôi biết ý nghĩa của lỗi. Nhưng tại sao?
Đây có phải chỉ là thông báo để thực thi thực tiễn tốt nhất không?

Tôi rất mới lập trình logic.
Cảm ơn!

+0

Đối với những người không biết cách khắc phục: Nhóm quan hệ (trong trường hợp này là 'nam' và' nữ') theo tên của mối quan hệ. –

Trả lời

12

Chính xác, đây là cảnh báo để thực thi các phương pháp hay nhất, đó là đặt tất cả các mệnh đề liên quan lại với nhau trong tệp nguồn. Ngoài ra, sự gần nhau của mệnh đề với nhau trong tệp nguồn không quan trọng, miễn là thứ tự tương đối của chúng không thay đổi.

+0

có cách tắt nó không? Đôi khi tôi không thể viết mã theo cách đó. – intelis

+1

@intelis Có một cách để nói với Prolog rằng bạn có ý định lan truyền các mệnh đề xung quanh ([liên kết đến một câu trả lời giải thích cách thực hiện nó] (http://stackoverflow.com/q/2482101/335858)). – dasblinkenlight

+0

cảm ơn, nhưng nó không chỉ là mệnh đề. Tôi nhận được nhiều cảnh báo khác nhau, như biến Singleton, v.v. – intelis

5

Cảnh báo khuyến khích thực hành tốt nhất và giúp phát hiện lỗi chính tả. Dưới đây là một ví dụ typo:

small(ant). 
small(fly). 
small(molecule). 

smell(sweet). 
smell(pungent). 
small(floral). 

Sai lầm khó có thể nhận ra, nhưng may mắn thay các trình biên dịch cảnh báo:

Warning: /tmp/test.pl:7: 
Clauses of small/1 are not together in the source-file 

Với sự cảnh báo và lỗi dòng, người ta có thể tìm và sửa lỗi đánh máy nhanh hơn.

ISO Prolog cung cấp chỉ thị discontiguous/1 để tắt tiếng cảnh báo này cho các vị từ cụ thể. Xem phần 7.4.2.3 của thông số kỹ thuật. Nó được sử dụng như thế này:

:- discontiguous small/1. 
Các vấn đề liên quan