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.

エラーが発生しました:

| ?- 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にあります。

4

1 に答える 1

4

変数ファンクターを受け入れるPrologを知りません。call / 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)
    ...
于 2012-04-20T06:01:07.110 に答える