私たちのプロローグコースにはこの課題があります。週に 1 時間の Prolog を 2 か月続けた後でも、それはまだ謎に包まれています。私の思考は手続き型言語から適応できないようです。
同じ名前でアリティ 1、2、3 の述語/ファンクターを含むナレッジ ベースがあります。呼び出し形式は次のようになります。
search(ファンクター名、引数、S)。
答えは、アリティに関係なく、このファンクター名と引数を持つすべての出現を見つける必要があります。回答は次の形式にする必要があります。
S = functor_name(argument);
S = functor_name(argument,_);
S = functor_name(_,argument);
S = functor_name(argument,_,_);
S = functor_name(_,argument,_);
S = functor_name(_,_,argument);
false.
call を使用して、ナレッジ ベースのエントリが存在するかどうかをテストできることがわかりました。
しかし、呼び出しはファンクター名の変数では機能しないようです。ファンクター名に変数を使用する方法がわかりません。
アップデート:
私の質問は部分的に答えられました。私の新しいコードは、アリティ 1、2、および 3 について true と false を返します (以下を参照)。
search(Person,Predicate) :-
ID = Person, Key = Predicate, current_functor(Key,1),
call(Key,ID)
; ID = Person, Key = Predicate, current_functor(Key,2),
(call(Key,ID,_);call(Key,_,ID))
; ID = Person, Key = Predicate, current_functor(Key,3),
(call(Key,ID,_,_);call(Key,_,ID,_);call(Key,_,_,ID)).
更新 2:
別の部分的な回答が来ました。それは用語のリストとして S を与えますが、「その他の」引数はプレースホルダーです:
search2(Predicate, Arg, S) :-
( Arity = 2 ; Arity = 3 ; Arity = 4 ),
functor(S, Predicate, Arity),
S =.. [_,Predicate|Args],
member(Arg, Args).
結果はかなりいいです。まだ欠落しています: 述語は括弧内にあってはならず、他の引数は、プレースホルダーとしてではなく、ナレッジ ベースから文字どおりに取得する必要があります。現在の結果は次のようになります。
?- search2(parent,lars,S).
S = parent(parent, lars) ;
S = parent(parent, lars, _G1575) ;
S = parent(parent, _G1574, lars) ;
S = parent(parent, lars, _G1575, _G1576) ;
S = parent(parent, _G1574, lars, _G1576) ;
S = parent(parent, _G1574, _G1575, lars).
最初から質問の仕方が間違っていたので、この質問は諦めます。私はもっと具体的に尋ねるべきでした - 私はまだPrologが得意ではないので、できませんでした。
@false が最も役に立ちました。私は彼の答えを受け入れています。