You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:32:03