【问题标题】:How to read a query from a text file, modify it, and call it如何从文本文件中读取查询、修改并调用它
【发布时间】:2015-07-30 07:11:38
【问题描述】:

我有一个Weka arff file,其中的属性是 Prolog 查询。

我想从文件中读取查询,修改它,然后运行查询。

weka arff 文件开头如下:

@relation propositionalization
@attribute 'link(_, A, _), link(A, _, _)' {'+'}
@attribute 'reaction(A, 0), link(A, B, _), link(B, C, _), reaction(C, 1), link(B, D, activation), reaction(D, 0), reaction(B, 0), link(A, E, _), link(E, F, follows), reaction(F, 1)' {'+','-'}
@attribute 'reaction(A, 0), link(A, B, _), link(B, C, _), reaction(C, 1), reaction(B, 1), link(A, D, _), link(D, E, follows), reaction(E, 0)' {'+','-'}

我有一个由以下组成的 dcg:

list([]) -->[].
list([L|Ls]) --> [L],list(Ls).
get_feature(Feature) --> "@attribute '",list(Feature), "'",list(_).

我读了文件:

read_my_file(File,Lines):-
open(File,read,Stream,[]),
    read_lines(Lines,Stream),!.

read_lines([H|T],Stream):-
  read_line_to_codes(Stream,H), H\=end_of_file, read_lines(T,Stream).

read_lines([],Stream):-close(Stream).

并使用以下调用phrase/2将特征提取为代码列表。

lineCodes_feature(Line,Feature):-
 phrase(get_feature(Feature),Line),!.

然后我打电话:

read_my_file('my_file.arff',Lines), 
member(Line,Lines), 
lineCodes_feature(Line,Feature), 
atom_codes(Atom,Feature).

然后回溯以将每个特征视为一个原子。

我被困在下一步修改和运行它作为查询。 我想将反应/2 项更改为反应/3,其中每个项的附加参数将相同。

例如原子术语

'reaction(A, 0), link(A, B, _), link(B, C, _), reaction(C, 1), reaction(B, 1), link(A, D, _), link(D, E, follows), reaction(E, 0)' 

我想成为一个列表:

[reaction(newarg,A, 0), link(A, B, _), link(B, C, _), reaction(newarg,C, 1), reaction(newarg,B, 1), link(A, D, _), link(D, E, follows), reaction(newarg,E, 0)]

这将允许我以某种方式使用 call/1 来查询内部数据库?

对我的方法的任何帮助或 cmet 表示赞赏。

【问题讨论】:

标签: prolog weka swi-prolog arff


【解决方案1】:

我认为您可以使用read_term_from_codes,然后调用结果项。

...
read_term_from_codes(Feature, Callable, []),
transform(Callable, Transformed),
Transformed,
...

一个例子,使用library(dcg/basics)phrase_from_file/2来简化解析

:- use_module(library(dcg/basics)).

sw :- phrase_from_file(arff_file, '/home/carlo/test/x.weka').

arff_file --> [] ; arff_line, arff_file.

arff_line -->
    "@relation propositionalization", eol.
arff_line -->
    "@attribute '", string(Codes), "'",
    {read_term_from_codes(Codes, Prolog, []),
     transform_conjunction(Prolog,Transf),
     format('~w ->~n ~w~n', [Prolog, Transf])},
    string(_), eol.
arff_line -->
    eol.

eol --> "\n".

transform_conjunction((A,B),(C,D)) :- transform_term(A,C), !, transform_conjunction(B,D).
transform_conjunction(A,C) :- transform_term(A,C).

transform_term(reaction(B,C), reaction(newArg,B,C)).
transform_term(T, T).

【讨论】:

  • phrase_from_file/2 --> +1!
  • 感谢您的回答。我还没有机会看它,只是让你知道。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-28
相关资源
最近更新 更多