首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Logtalk访问SWI-Prolog库

从Logtalk访问SWI-Prolog库
EN

Stack Overflow用户
提问于 2013-05-16 00:49:49
回答 1查看 184关注 0票数 2

我在使用Logtalk时很开心,但在使用phrase_from_file时遇到了一个问题。具体来说,我的案例看起来像这样:

代码语言:javascript
复制
:- object(scan_parser).

   :- public(scanlist//1).
   scanlist([Scan|Scans]) --> scan(Scan), dcg_basics:blanks, scanlist(Scans).
   scanlist([]) --> [].

   :- public(scan_file/2).
   :- mode(scan_file(+filename, -scans), one).
   scan_file(Filename, Scans) :- pio:phrase_from_file(scanlist(Scans), Filename).

   ...
:- end_object.

问题都出在对phrase_from_file的调用上。它找不到scanlist,大概是因为它是这个对象的本地对象,所以我得到了这个错误:

代码语言:javascript
复制
?- scan_parser::scan_file('input.txt', Scans).
ERROR: phrase/3: Undefined procedure: pio:scanlist/3

但是,如果我尝试使用模块引用来强化它,如下所示:

代码语言:javascript
复制
scan_file(Filename, Scans) :- pio:phrase_from_file(::scanlist(Scans), Filename).

我得到了这个错误:

代码语言:javascript
复制
?- scan_parser::scan_file('input.txt', Scans).
ERROR: phrase/3: Undefined procedure: pio: (::)/3

如果我使用pio:phrase_from_file(this::scanlist(Scans), Filename)pio:phrase_from_file(scan_parser::scanlist(Scans), Filename),也是如此。如果我在模拟SWI的模块功能时使用单个冒号,我会得到类似ERROR: phrase/3: Undefined procedure: scan_parser:scanlist/3的消息。

我假设这里的问题是SWI的PIO库试图构造一些东西来交给phrase,而它就是不够智能。但这是我经常遇到的事情,使用phrase_from_file/2,我相信还会有其他时候我想从SWI的库中挖掘出一些东西并借给我。正确的前进方向是什么?我希望尽可能地保留Logtalk的封装。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-16 04:11:51

我正在为Logtalk 3.x设计一个通用的解决方案,以支持将闭包作为元参数的Prolog模块元谓词。同时,您可以尝试以下(丑陋的)解决方法:

代码语言:javascript
复制
% ensure the module is loaded
:- use_module(library(pio)).


:- object(scan_parser).

    % override the non-standard meta-arguments declarations
    :- meta_predicate(pio:phrase_from_file(2,*)).

   :- public(scanlist//1).
   scanlist([Scan|Scans]) --> scan(Scan), dcg_basics:blanks, scanlist(Scans).
   scanlist([]) --> [].

   :- public(scan_file/2).
   :- mode(scan_file(+filename, -scans), one).
   scan_file(Filename, Scans) :- pio:phrase_from_file(user:scan_parser_scanlist(Scans), Filename).

    {scan_parser_scanlist(Scans, A, B)} :-
        phrase(scanlist(Scans), A, B).

    ...

:- end_object.

我无法测试,因为您只发布了目标代码的一部分。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16570776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档