Io Prolog从格式化文本文件导入事实
我在文本文件input.txt中有以下输入Io Prolog从格式化文本文件导入事实,io,prolog,Io,Prolog,我在文本文件input.txt中有以下输入 atom1,atom2,atom3 relation(atom1 ,[10,5,2]) relation(atom2 ,[3,10,2]) relation(atom3 ,[6,5,10]) 第一行包括文件中关系谓词中使用的原子列表,其余每一行按第一行列表的顺序表示一个关系谓词。关系(atom1,[x,y,z])表示atom1与第一个原子的关系值为10,与第二个原子的关系值为5,与第三个原子的关系值为2 我需要读取此文件并分别为每个原子添加表示
atom1,atom2,atom3
relation(atom1 ,[10,5,2])
relation(atom2 ,[3,10,2])
relation(atom3 ,[6,5,10])
第一行包括文件中关系谓词中使用的原子列表,其余每一行按第一行列表的顺序表示一个关系谓词。关系(atom1,[x,y,z])表示atom1与第一个原子的关系值为10,与第二个原子的关系值为5,与第三个原子的关系值为2
我需要读取此文件并分别为每个原子添加表示关系的值。例如,这些是将为atom1添加的关系值:
assert(relation(atom1, atom1,10)).
assert(relation(atom1, atom2, 5)).
assert(relation(atom1, atom3, 2)).
我已经阅读了一些prolog io教程,并看到了一些关于使用DCG的建议,但我是一个初级prolog程序员,在选择解决问题的方法时遇到了困难。所以我在这里向有经验的prolog程序员寻求帮助。因为您没有说明您使用的是什么prolog,这里有一个用SWI prolog编写的代码片段。我试图通过SWI Prolog文档引用来发送非ISO内置的信号
parse_input :-
open('input.txt', read, S),
parse_line(S, atoms(Atoms)),
repeat,
( parse_line(S, a_struct(relation(A, L)))
-> store(Atoms, A, L), fail
; true ),
close(S).
:- meta_predicate(parse_line(+, //)).
parse_line(S, Grammar) :-
% see http://www.swi-prolog.org/pldoc/doc_for?object=read_line_to_codes/2
read_line_to_codes(S, L),
L \= end_of_file,
phrase(Grammar, L).
% match any sequence
% note - clauses order is mandatory
star([]) --> [].
star([C|Cs]) --> [C], star(Cs).
% --- DCGs ---
% comma sep atoms
atoms(R) -->
star(S),
( ",",
{atom_codes(A, S), R = [A|As]},
atoms(As)
; {atom_codes(A, S), R = [A]}
).
% parse a struct X,
% but it's far easier to use a builtin :)
% see http://www.swi-prolog.org/pldoc/doc_for?object=atom_to_term/3
a_struct(X, Cs, []) :-
atom_codes(A, Cs),
atom_to_term(A, X, []).
% storage handler
:- dynamic(relation/3).
store(Atoms, A, L) :-
nth1(I, L, W),
nth1(I, Atoms, B),
assertz(relation(A, B, W)).
通过示例input.txt,我得到
?- parse_input.
true .
?- listing(relation).
:- dynamic relation/3.
relation(atom1, atom1, 10).
relation(atom1, atom2, 5).
relation(atom1, atom3, 2).
relation(atom2, atom1, 3).
relation(atom2, atom2, 10).
relation(atom2, atom3, 2).
relation(atom3, atom1, 6).
relation(atom3, atom2, 5).
relation(atom3, atom3, 10).
HTH我正在使用swi prolog。所以,这太合适了!!非常感谢你!但是使用assertz而不是assert会产生任何差异吗?不,assertz/1与assert/1相同。或者更好,它是官方(ISO)认可的名称。