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.
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ó? –
Xem [câu trả lời này] (https://stackoverflow.com/a/9091262/812818). –
Không phải EOF, EOT. Tôi không mong đợi '[người dùng] .' đang phát hiện EOF. –