2016-11-21 4 views
0

私はプロローグを学んでいて、次の質問につきました:Prolog - Seeing if the same element occurs in two listsメンバー[H | T]はどういう意味ですか?

この質問には次の行が含まれます:=(member(X,[H|T]), member[Z|Q]))

私は約member(?Elem, ?List)を知っていますが、member[Z|Q]の部分は分かりません。これは何を意味するのでしょうか?そして、閉鎖している鏡像はあまりにもありませんか?

答えて

2

概要:

はすべてでこの心配しないでください。ここで

いくつかの理由です:

構文エラー

まず第一に、これは無効な構文です。あなたがにリンクプログラムに相談すると、次のようになります。

含む正確にラインを示す
 
ERROR: file.pl:5:28: Syntax error: Operator expected 

 
    =(member(X,[H|T]), member[Z|Q])), 

疑わしい意味

第二に、我々は何とか問題の構文を修正してもして、この行を次のように書く:

 
    =(member(X,[H|T]), member_whatever), 

次に、それはまだ非常に疑わしいこれは、著者がを表現することを意味します。は表現しています。

この場合に使用される述語は(=)/2で、あなたのように中置記法を使用して、この同等を書き込むことができます。

 
    member(X,[H|T]) = member_whatever, 

そしてこのことから、このが成功しないことをすでに明らかです(=)/2はさらに多くの一般的なケースについてはを保持していないので、

 
    member(_,_) = member_whatever, 

もちろん、上記のより具体的なケースでももちろん失敗します。

基本的な問題

Prologでプログラムする場合、を保持しているものを  明確な記述に焦点を当てます。

例えば、「同じ要素が2つのリストに起こる」と述べているすることが直接的である:

 
element_in_both(E, As, Bs) :- 
    member(E, As), 
    member(E, Bs). 

それだそれ!次のようにあなたはそれを読むことができE場合は  AsEのメンバーである  Bsその後、Eのメンバーである両方Asと  Bsのメンバーです。

それは、例えば、非常に一般的に動作します:あなたはに、この述語を使用することができます

 
?- length(Cs, _), 
    append(As, Bs, Cs), 
    element_in_both(E, As, Bs). 
Cs = [E, E], 
As = Bs, Bs = [E]; 
Cs = [E, E, _2946], 
As = [E], 
Bs = [E, _2946]; 
Cs = [E, _2940, E], 
As = [E], 
Bs = [_2940, E]. 

は、この関係は、それが特定のインスタンスのために保持しているテストに、を保持しているリストを生成完全部分リストこの述語を満たすもの など

このすべては、この関係を作成する条件の明確な宣言的な記述に従います。  ホールドです。

Prologコースでは、宣言型プログラミングのこの単純で基本的な原則を不必要に複雑にする傾向があります。これに落ちないでください。 トラップ。あなたの述語が複雑になると、あなたはしばしばより単純なものを見落としてしまいます。

+0

文法エラーの説明を長くしてくれてありがとう!まだ何か新しいことを学んでいます(この関係を持つリストを生成するためにこの述語を使うことができます) –

+2

これは論理プログラミングの主要な魅力の一つです。純粋な宣言的な記述から、その関係を満たす。これは、テストケースを書くときや、単に述語を調べるときに便利です。述語が何を意味するのかを知りたい場合は、最も一般的なクエリ(すべての引数が変数です)を試してください。これは、述語についての詳細を見つけるのに非常に便利であり、コードが非常に多目的でコンパクトになるため、実際には非常に便利です。 – mat

関連する問題