如何在Prolog中实现文件短语查找?phrase_from_file/2使用求助
解决Prolog中使用
phrase_from_file/2查找文件指定短语的问题 嘿,我来帮你搞定这个Prolog的文件短语查找问题!你的核心问题是对phrase_from_file/2的用法理解有点偏差——它的第一个参数需要的是DCG语法规则,而不是直接传要查找的字符串,这也是你当前代码匹配失败的原因。
问题出在哪?
你写的代码:
search(Smthing):- phrase_from_file(Smthing,'b.txt'); false.
当你调用search('myphrase').时,'myphrase'是一个原子,Prolog会把它转换成字符列表['m','y','p','h','r','a','s','e'],然后phrase_from_file会尝试让整个文件的内容完全等于这个字符列表。但你的文件内容比这个长多了,所以匹配失败,加上后面的; false,最终就返回了false。
正确的实现方式
我们需要定义一个DCG规则,用来匹配“任意字符 + 目标短语 + 任意字符”的模式(也就是文件中包含目标短语作为子串),然后用phrase_from_file去调用这个规则。
完整代码示例(以SWI-Prolog为例)
% DCG规则:匹配包含指定短语的字符流 contains_phrase(Phrase) --> ..., % 匹配任意数量的前置字符(包括0个) Phrase, % 匹配目标短语 ... . % 匹配任意数量的后置字符(包括0个) % 定义DCG的省略号(...),用来匹配任意数量的单个字符 ... --> [] | [_], ... . % 搜索谓词:处理输入(支持原子或字符列表/字符串),并调用phrase_from_file search(Target) :- % 如果传入的是原子,先转换成字符列表;否则直接使用 ( atom(Target) -> atom_chars(Target, TargetChars) ; TargetChars = Target ), % 用DCG规则匹配文件内容 phrase_from_file(contains_phrase(TargetChars), 'b.txt').
怎么用?
- 如果你传入原子:
search('myphrase').,这会返回true,因为你的文件里确实包含这个短语。 - 如果你用SWI-Prolog的字符串:
search("myphrase").,同样能正常工作。
原理说明
phrase_from_file/2会把整个文件的内容转换成字符流(或码点流),然后用第一个参数的DCG规则去匹配这个流。我们定义的contains_phrase/1规则,本质是告诉Prolog:“只要在字符流的任意位置找到目标短语,就算匹配成功”——前置的...跳过任意字符找到短语的起始位置,后置的...忽略短语之后的所有内容。
内容的提问来源于stack exchange,提问作者Andrzej Ustupski
相关产品推荐
相关产品推荐

