对象提供的分类方法

Category method provided by the object

假设我有:

:- category(multi).

    :- public([set/2, set/3]).
    %% set(r,c,v).
    set([],_). %% multi-ix/value set    
    set([[Row, Col]|RCs], Value) :- \+ is_list(Value), set(Row, Col, Value), set(RCs, Value).
    set([[Row, Col]|RCs], [V|Vs]) :- set(Row, Col, V), set(RCs, Vs).

:- end_category.


 *     Declared static predicate called but not defined: set/3

set/3 由对象提供...如何使其工作..?

只需在self中调用set/3谓词(即在接收set/2消息的对象的上下文中):

:- category(multi).

    :- public([set/2, set/3]).
    %% set(r,c,v).
    set([],_). %% multi-ix/value set    
    set([[Row, Col]|RCs], Value) :- \+ is_list(Value), ::set(Row, Col, Value), set(RCs, Value).
    set([[Row, Col]|RCs], [V|Vs]) :- ::set(Row, Col, V), set(RCs, Vs).

:- end_category.

例如,假设以下对象导入类别:

:- object(proto,
    imports(multi)).

    set(1, 1, 42).

:- end_object.

然后您可以使用以下查询:

?- proto::set([[1,1]], V).
V = 42 ;
V = [42|_].

P.S。 is_list/1 谓词不是标准的 built-in 谓词。但相同的功能可从 list 库对象获得。比如加载basic_types(loader)后,可以在分类中使用:

:- uses(list, [valid/1 as is_list/1]).

或者,也可以使用同一库提供的 type 对象:

:- uses(type, [valid(list,Term) as is_list(Term)]).