2012-04-20 69 views
2

我是序言新手,並且使用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. 

錯誤arised:

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

回答

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) 
    ... 
+0

可選擇地,一個可併入密鑰值作爲參數之一。 – 2012-04-20 09:53:20

+0

@Alexander Serebrenik:你的意思是'atom_concat(search_by_,Name,Callable),call(Callable,...)'? – CapelliC 2012-04-20 10:07:08

+0

不,我想過關於重新搜索search_by_name和search_by_point以搜索第一個參數是名稱或點。 – 2012-04-20 10:16:20

相關問題