如何在 Prolog 中快速保存和加載資料檔案以用于游戲?
使用 save(File_name,Term) 保存檔案,其中 File_name 是檔案夾 folder_name 中的檔案名,Term 是包含資料檔案的化合物。
?- save("file_name.txt",[[["player_name","Harold"],["score",10],["symbol",key_word]],[["player_name","Queenie"],["score",20],["symbol",schema]]]).
使用 load(File_name,Term) 加載檔案,其中 File_name 是檔案夾 folder_name 中的檔案名,Term 是從檔案加載的內容。
?- load("file_name.txt",Term),writeln1(Term).
Term=[[["player_name","Harold"],["score",10],["symbol",key_word]],[["player_name","Queenie"],["score",20],["symbol",schema]]]
uj5u.com熱心網友回復:
如果您只想保存一個術語,您想要的基本版本如下:
save(Filename, Term) :-
open(Filename, write, Stream),
write_canonical(Stream, Term),
write(Stream, '.'),
close(Stream).
load(Filename, Term) :-
open(Filename, read, Stream),
read(Stream, Term),
close(Stream).
例如:
?- save('hello.term', hello(world)).
true.
此時檔案hello.term(名稱是任意的)包含以下內容:
hello(world).
然后:
?- load('hello.term', Term).
Term = hello(world).
筆記:
- 該
read謂詞希望讀取終止時間(期限.),但write謂詞不寫這些了自己。因此save/2需要明確地寫出來。 - 這里沒有錯誤處理。
- 還有一個
write/2可以使用的謂詞。如果您使用運算子,則區別是相關的:該術語a b將寫作a bbywrite和 as(a, b)byread。即使在使用不同的運算子宣告進行寫入和讀取的情況下,也可以正確讀取后者。 - 如果您想撰寫或閱讀多個術語,則需要做更多的作業。
uj5u.com熱心網友回復:
使用下面的代碼,您可以在 Prolog 中保存和加載資料檔案。
% save("file_name.txt",[[["player_name","Harold"],["score",10],["symbol",key_word]],[["player_name","Queenie"],["score",20],["symbol",schema]]]).
save(File_name,Term) :-
string_concat("folder_name/",File_name,Path),
term_to_atom(Term,Atom),
string_atom(String,Atom),
(open_s(Path,write,Stream1),
write(Stream1,String),
close(Stream1)),!.
% load("file_name.txt",Term).
load(File_name,Term) :-
File_name="file_name.txt",
string_concat("folder_name/",File_name,Path),
phrase_from_file_s(string(Codes),Path),
string_codes(String,Codes),
atom_to_term(String,Term,[]).
open_s(File,Mode,Stream) :-
atom_string(File1,File),
open(File1,Mode,Stream),!.
string_atom(String,Atom) :-
atom_string(Atom,String),!.
phrase_from_file_s(string(Output), String) :-
atom_string(String1,String),
phrase_from_file(string(Output), String1),!.
string(String) --> list(String).
list([]) --> [].
list([L|Ls]) --> [L], list(Ls).
writeln1(Term) :-
term_to_atom(Term,Atom),
writeln(Atom),!.
另請參見List Prolog 中的string to list ( Test 15 ),它與 ??atom_to_term//3 的作用相同。上面的謂詞取代了使用長語法的需要,但是我已經在我的長 SWI-Prolog 語法上發布了答案,我的長 SWI-Prolog 語法一直失敗,我無法讓我的 Prolog DCG 與 atom concat 一起作業,供感興趣的人使用。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/362117.html
