Могу ли я использовать субфункционный функтор с переменной в предикате?

Я новичок в прологе, и использую BProlog.

Я читал пример программы для выполнения запроса по группе связанных данных. Но чтобы сделать выводы из фактов с похожей структурой, они написали много предикатов, таких как search_by_name,search_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)

Я делаю это неправильно или в прологе такое замещение невозможно?

код и пример данных можно найти по адресу https://gist.github.com/2426119

1 ответ

Решение

Я не знаю ни одного Пролога, который принимает переменные функторы. Есть вызов /N или Univ+ Call/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)
    ...
Другие вопросы по тегам