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