2011-11-27 44 views
6

Tôi đã cố gắng lặp qua một danh sách và viết nó vào một tập tin, tại sao những điều sau đây không hoạt động?Viết vào tập tin (Prolog)

loop_through_list(List) :- 
    member(Element, List), 
    write(Element), 
    write(' '), 
    fail. 

write_list_to_file(Filename,List) :- 
    tell(Filename),  % open file to be written 
    loop_through_list(List), 
    told.    % flush buffer 
+1

Nhìn vào tệp bạn đã tạo khi chạy 'write_list_to_file/2'! Rất có thể nó sẽ không chỉ có các thành phần của danh sách trong nó, mà còn một số dữ liệu không mong muốn khác ở cuối tệp. Như những người khác đã nhận xét, bằng cách sử dụng 'mở/3' và' đóng/1' là an toàn hơn nhiều. – false

+0

Tôi tò mò về nơi mà thông tin về sự không đáng tin cậy của việc kể và nói có thể được tìm thấy, bạn có thể vui lòng chỉ cho tôi nguồn không? – chutsu

+1

Bạn tìm thấy giải thích [ở đây] (http://stackoverflow.com/questions/8269971/prolog-how-to-save-file-in-an-existing-file/8270091#8270091) – false

Trả lời

7

Thứ nhất, tại sao nó không thành công:
Bạn sử dụng không kích tùy ý, có thể là một kỹ thuật tốt, nhưng không có. Bởi vì nó sẽ làm cho vị ngữ của bạn sai khi kết thúc, khi thành viên đã hết các giải pháp. Sau đó, một khi loop_through_list là sai, nói không đạt được và các văn bản không được thực hiện đúng (khi tôi kiểm tra nó, tập tin được tạo ra nhưng không có gì được viết).
Nếu bạn sử dụng:

loop_through_list([]). 
loop_through_list([Head|Tail]) :- 
    write(Head), 
    write(' '), 
    loop_through_list(Tail). 

thay vào đó, nó hoạt động. Tuy nhiên, ngay cả khi mã này hoạt động, bạn có thể muốn sử dụng mở (Tên tệp, ghi, Luồng), ghi (Luồng, Phần tử) và đóng (Luồng) thay vì nói và được giải thích vì các lý do được giải thích trong liên kết ở cuối câu trả lời này.
Ví dụ:

loop_through_list(_File, []) :- !. 
loop_through_list(File, [Head|Tail]) :- 
    write(File, Head), 
    write(File, ' '), 
    loop_through_list(File, Tail). 

write_list_to_file(Filename,List) :- 
    open(Filename, write, File), 
    loop_through_list(File, List), 
    close(File). 

hoặc

loop_through_list(File, List) :- 
    member(Element, List), 
    write(File, Element), 
    write(File, ' '), 
    fail. 

write_list_to_file(Filename,List) :- 
    open(Filename, write, File), 
    \+ loop_through_list(File, List), 
    close(File). 

sử dụng mã của bạn và lừa joel76.

Xem Prolog how to save file in an existing file
Nó bao gồm cùng một vấn đề.

+0

bằng cách này, cái gì là '\ +'? có nghĩa là không (ví dụ: '!' trong C). – chutsu

+1

@chutsu: vâng, có. Trong SWI-pl ít nhất (và những người khác có thể cho bạn biết về các triển khai khác), ** không/1 ** không được dùng nữa và việc sử dụng ** \ +/1 ** được khuyến nghị như đã nói trong [trang thủ công] này (http : //www.swi-prolog.org/pldoc/doc_for? object = not/1) – m09

2

vị loop_through_list (danh sách), luôn thất bại, vì vậy để succed bạn chỉ phải viết \ + loop_through_list (danh sách),

3

Tôi không thấy lý do để làm sử dụng phương pháp này để viết một danh sách vào một tập tin.
Lập trình trong prolog thường không liên quan đến vòng lặp;
bên cạnh đó, đây không phải là cấu trúc vòng lặp, nó giống như một hack (hoặc thậm chí lạm dụng).
(và cũng giống như trường hợp của bạn dẫn đến lỗi bất ngờ và các vấn đề)

Chỉ cần sử dụng đệ quy và in các phần tử của danh sách:

write_list([]). 
write_list([H|T]):- 
    write(H), 
    write(' '), 
    write_list(T). 

thêm thanh lịch và có thể hiệu quả hơn nữa.

khác hơn, sử dụng mở/4 vv (ISO IO) thay vì cho biết/1 vv (Edinburgh IO) nói chung là tốt hơn; kiểm tra false's post

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