0

我在文本文件 input.txt 中有以下输入

atom1,atom2,atom3
relation(atom1  ,[10,5,2])
relation(atom2  ,[3,10,2])
relation(atom3  ,[6,5,10])

第一行包括文件中关系谓词中使用的原子列表,剩余的每一行代表一个关系谓词,按第一行 list.relation(atom1, [x,y,z]) 的顺序排列。relation(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 程序员寻求帮助。

4

1 回答 1

1

由于您没有说明您使用的是什么 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).

高温高压

于 2013-04-14T08:14:55.233 回答