2017-11-07 12 views
5

Tôi đang viết một trình bao bọc cho một thông dịch viên Prolog được sử dụng từ một ngôn ngữ lập trình khác. Tôi không đi vào chi tiết, nhưng về cơ bản nó tạo ra một chương trình Prolog phù hợp và cung cấp chương trình cho một thông dịch viên từ đầu vào tiêu chuẩn. Tôi tương đối mới với Prolog.Chấm dứt [người dùng]. với một nhân vật EOT trong Prolog

Vấn đề là, tôi không thể tìm thấy thông số kỹ thuật cho cụm từ [user]. đọc quy tắc từ đầu vào chuẩn. Cụ thể, làm thế nào nó phát hiện sự kết thúc của đầu vào.

Cách trực quan nhất để đạt được điều này là gửi một ký tự EOT (Ctrl-D), nhưng nó dường như không hoạt động. Dưới đây là một ví dụ minh họa, thay thế^D bằng một ký tự EOT thực tế. Giả sử tệp này được lưu trong input.pl. Tôi dự định tạo mã như vậy theo chương trình và đưa nó vào quá trình prolog nền thông qua đầu vào tiêu chuẩn.

[user]. 
factorial(0,1). 
factorial(N,F) :- (>(N,0),is(N1,-(N,1)),factorial(N1,F1),is(F,*(N,F1))). 
^D 
factorial(3,W). 

Khi tôi chạy cat input.pl | <prolog> nơi <prolog> là bất cứ điều gì Prolog phiên dịch (swipl, yap, vv), nó dường như không nhận ra^D. Tại sao điều này và làm cách nào để tôi giải quyết vấn đề này? Trên thiết bị đầu cuối^D hoạt động tốt.

Ví dụ trên được cho là trả về "W = 6". SWI than phiền Syntax error: illegal_character. Yap dường như bỏ qua^D, chỉ phân tích cú pháp mọi thứ và trả lại yes.

Tất nhiên tôi có thể viết chương trình vào một tệp tạm thời và yêu cầu thông dịch viên tham khảo tệp, nhưng nó chậm.

+1

EOF không giống với luồng đang ở cuối tệp hoặc bị đóng. '[user] .' báo cho Prolog đọc từ người dùng cho đến khi luồng kết thúc hoặc kết thúc tập tin được báo hiệu. Thiết bị đầu cuối chuyển đổi Ctrl-D của người dùng thành tín hiệu đó. Nó không phải là một ký tự chữ xuất hiện trong luồng đầu vào. Nếu không, làm thế nào bạn sẽ có thể 'cat' một tập tin với các ký tự EOF trong nó? –

+0

Xem [câu trả lời này] (https://stackoverflow.com/a/9091262/812818). –

+0

Không phải EOF, EOT. Tôi không mong đợi '[người dùng] .' đang phát hiện EOF. –

Trả lời

5

Nói end_of_file. thay cho ^D. Điều này làm việc trong nhiều triển khai Prolog vì đọc thực tế của họ được thực hiện với read/1. Trong lịch sử, từ DECsystem 10 Prolog, các hệ thống chỉ có read/1 nhưng không có at_end_of_stream/0 và các biến vị ngữ có sẵn có liên quan. Trong thực tế, một số lập trình viên đã sử dụng end_of_file. trong tệp nguồn Prolog để cho phép thêm văn bản tùy ý vào nguồn Prolog.

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