首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用带有Logtalk对象方法的"univ“Prolog谓词作为参数

使用带有Logtalk对象方法的"univ“Prolog谓词作为参数
EN

Stack Overflow用户
提问于 2015-10-01 11:46:18
回答 1查看 143关注 0票数 0

如何使用以Logtalk对象方法为参数的'Univ(http://www.swi-prolog.org/pldoc/doc_for?object=(%3D..%29/2)‘( =../2 ) prolog谓词?

请考虑以下代码:

代码语言:javascript
复制
baz(foo(X)) :-
  write(predicate), write(X), nl.

run :-
    Term =.. [baz, foo(testfoo)],
    write(Term), nl, Term,nl,    
    TermLgt =.. [bar::baz, foo(testfoo2)],
    write(TermLgt), nl, Term,nl.    

:- object(bar).

  :- public(baz/1).
  baz(foo(X)) :-
    write(method), write(X), nl.

:- end_object.

:- object(main).

  :- public(run/0).
  run :-
    Term =.. [baz, foo(testfoo)],
    write(Term), nl, Term,nl,    
    TermLgt =.. [bar::baz, foo(testfoo2)],
    write(TermLgt), nl, Term,nl.

:- end_object.

我会得到:

代码语言:javascript
复制
?- {myfile}.
% (0 warnings)
true.

?- run.
baz(foo(testfoo))
predicatetestfoo

ERROR: =../2: Type error: `atom' expected, found `bar::baz' (a compound)

?- main::run.
baz(foo(testfoo))
ERROR: Undefined procedure: baz/1
ERROR:   However, there are definitions for:
ERROR:         baz/1

什么样的解决办法可以用来进行良好的解释/编译?像predsort/3 (先排序/3文档)这样的swi构建谓词似乎也存在同样的问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-01 14:04:12

标准的=../2谓词在从list构造术语时期望第一个list参数是一个原子,但是bar::baz是一个带有函子::/2的复合词(对于顶级查询和加载Logtalk时都定义为谓词)。解决方案是编写以下内容:

代码语言:javascript
复制
baz(foo(X)) :-
    write(predicate), write(X), nl.


run :-
    Term =.. [baz, foo(testfoo)],
    write(Term), nl, call(Term), nl,    
    TermLgt =.. [::, bar, Term],
    write(TermLgt), nl, call(Term), nl.    


:- object(bar).

    :- public(baz/1).
    baz(foo(X)) :-
        write(method), write(X), nl.

:- end_object.


:- object(main).

    :- public(run/0).
    run :-
        Term =.. [baz, foo(testfoo)],
        write(Term), nl, Term,nl,    
        TermLgt =.. [::, bar, Term],
        write(TermLgt), nl, Term,nl.

:- end_object.

通过这些更改,您可以得到:

代码语言:javascript
复制
?- {univ}.
% [ /Users/pmoura/Desktop/univ.lgt loaded ]
% (0 warnings)
true.

?- run.
baz(foo(testfoo))
predicatetestfoo

bar::baz(foo(testfoo))
predicatetestfoo

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

https://stackoverflow.com/questions/32886831

复制
相关文章

相似问题

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