如何在文件prolog中找到短语

时间:2018-03-31 16:44:26

标签: prolog swi-prolog dcg

我正在尝试使用Prolog在文件中找到短语,如果它的结果​​只是恢复真实。问题是我不知道如何使用这个phrase_from_file / 2。我做了类似的事。

search(Smthing):-   
    phrase_from_file(Smthing,'b.txt');
    false.

执行:     搜索(' myphrase&#39)。

b.txt文件:

(fs1111myphrase111asd)
 aaaamyphrase

有谁能告诉我如何实施它?

2 个答案:

答案 0 :(得分:1)

library(pio)的主要吸引力在于它只是将DCG应用于文件。

首先,您需要对Prolog中的 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构成的文件内容的基础表示)。