使用"univ" Prolog 谓词和 Logtalk 对象方法作为参数



如何使用'Univ' (=../2) prolog谓词与Logtalk对象方法作为参数?

考虑以下代码:

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.

我将得到:

?- {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

为了一个好的解释/编译使用什么解决方案?似乎问题与swi-prolog构建谓词相同,如predsort/3 (predsort/3 doc)。

标准=../2谓词期望,当从列表构造一个术语时,第一个列表参数是一个原子,但bar::baz是一个具有函子::/2的复合术语(它被定义为谓词-用于顶级查询-并且作为Logtalk加载时的操作符)。解决方案是这样写:

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.

修改后,得到:

?- {univ}.
% [ /Users/pmoura/Desktop/univ.lgt loaded ]
% (0 warnings)
true.
?- run.
baz(foo(testfoo))
predicatetestfoo
bar::baz(foo(testfoo))
predicatetestfoo
true.

相关内容

  • 没有找到相关文章

最新更新