我正在尝试使用Prolog在文件中找到短语,如果它的结果只是恢复真实。问题是我不知道如何使用这个phrase_from_file / 2。我做了类似的事。
search(Smthing):-
phrase_from_file(Smthing,'b.txt');
false.
执行: 搜索(' myphrase&#39)。
b.txt文件:
(fs1111myphrase111asd)
aaaamyphrase
有谁能告诉我如何实施它?
答案 0 :(得分:1)
library(pio)
的主要吸引力在于它只是将DCG应用于文件。
首先,您需要对Prolog中的 DCG 有基本的了解。 有关详细信息,请参阅dcg。
接下来,重点介绍如何使用DCG 正常描述任务。您想要描述包含[m,y,p,h,r,a,s,e
]的列表,或者代码 - [109,121,etc.]
,作为子列表。
用于描述任何内容的有用非终结符是:
... --> [] | [_], ... .
因此我们可以将给定属性的列表描述为:
contains_myphrase --> ..., "myphrase", ... .
这样做的好处是我们已经能够以交互方式测试:
?- length(Ls, _), phrase(contains_myphrase, Ls). Ls = [109, 121, 112, 104, 114, 97, 115, 101] ; Ls = [109, 121, 112, 104, 114, 97, 115, 101, _8260] ; Ls = [_8212, 109, 121, 112, 104, 114, 97, 115, 101] ; Ls = [109, 121, 112, 104, 114, 97, 115, 101, _8260|...] ; Ls = [_8212, 109, 121, 112, 104, 114, 97, 115, 101|...] ; Ls = [_8212, _8218, 109, 121, 112, 104, 114, 97, 115|...] .
然后我们也可以将相同的DCG应用于文件:
?- phrase_from_file(contains_myphrase, 'b.txt'). true .
直接概括这样就可以指定您要查找的内容参数。
但是,我建议首先使用phrase_from_file/2
执行此而不使用。只需在DCG上工作,并研究不同的编码。特别是,您应该找出以下两者之间的区别:
进行以下工作首先:
?- phrase(contains(MyPhrase), Ls).
这应该包含 iff Ls
包含MyPhrase
作为子列表,其中MyPhrase
可以例如被指定为列表代码我说“可以”因为你应该为你的用例挑选一个最方便和自然的编码。根据个人经验,我可以告诉您,使用字符列表比使用代码列表更方便。您可能在此上下文中找到的Prolog标志称为double_quotes
。
使用DCG解决后,可以直接使用phrase_from_file/2
。
答案 1 :(得分:0)
要使用各种phrase
谓词,您必须了解Prolog的DCG(明确句子语法)系统以定义语法。这是一个教程:http://www.pathwayslms.com/swipltuts/dcg/,每个其他合理的Prolog文本中都应该有DCG章节。另请注意,phrase_from_file/2
是SWI-Prolog扩展,据我所知,其他Prolog系统中没有。
所以你需要编写一个匹配输入项的任意序列的语法,它们是你的模式,然后是任意的休息。所有这一切都因为SWI-Prolog知道几种类似字符串的事情而变得复杂:字符串,原子,代码列表和字符列表。
无论如何,这是一个我在http://www.swi-prolog.org/pldoc/man?section=pio的SWI-Prolog文档中略微适应的例子:
:- use_module(library(dcg/basics)).
file_contains(File, Pattern) :-
phrase_from_file(match(Pattern), File).
match(Pattern) -->
string(_),
string(Pattern),
string(_).
您可以按如下方式运行:
?- file_contains('b.txt', `myphrase`).
true ;
true ;
false.
这不是非常提供信息,但两个true
结果意味着您的模式在输入文件中出现了两次。最终的false
意味着在这两个之后没有进一步的发生。
请注意,您的短语必须用反引号字符(`)括起来,以使SWI-Prolog将其解释为字符代码列表(由phrase_from_file / 2构成的文件内容的基础表示)。