我可以在谓词中使用变量的子句函数

时间:2012-04-20 05:03:17

标签: prolog b-prolog

我是prolog的新手,并且使用了BProlog。

我一直在阅读一些示例程序来对相关数据组执行查询。但是为了从具有相似结构的事实推断,他们编写了许多谓词,如search_by_namesearch_by_point,这些谓词部分重复。

% working search in example
search_by_name(Key,Value) :-
    Key == name,
    sname(ID,Value),
    point(ID,Point),
    write(Value),write(Point),nl.

当我尝试用这样更通用的版本替换它们时:

% a more general search I want to write
% but not accepted by BProlog
search_by_attr(Key,Value) :-
    Key(ID,Value),
    sname(ID,Name),
    point(ID,Point),
    write(Name),write(Point),nl.
出现错误:

| ?- consult('students.pl')
consulting::students.pl
** Syntax error (students.pl, 17-21)
search_by_attr(Key,Value) :-
        Key<<HERE>>(ID,Value),
        sname(ID,Name),
        point(ID,Point),
        write(Name),write(Point),nl.

1 error(s)

我是以错误的方式做到这一点,还是在prolog中不可能进行这样的替换?

可以在https://gist.github.com/2426119

找到代码和示例数据

1 个答案:

答案 0 :(得分:3)

我不知道任何Prolog接受变量仿函数。 有呼叫/ N,或univ +呼叫/ 1。

search_by_attr(Key,Value) :-
    call(Key, ID, Value), % Key(ID,Value)
    ...

search_by_attr(Key,Value) :-
    C =.. [Key, ID, Value], % univ
    call(C),                % Key(ID,Value)
    ...