いくつかの理由です:
構文エラー
まず第一に、これは無効な構文です。あなたがにリンクプログラムに相談すると、次のようになります。
含む正確にラインを示す
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
場合は As
とE
のメンバーである 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].
文法エラーの説明を長くしてくれてありがとう!まだ何か新しいことを学んでいます(この関係を持つリストを生成するためにこの述語を使うことができます) –
これは論理プログラミングの主要な魅力の一つです。純粋な宣言的な記述から、その関係を満たす。これは、テストケースを書くときや、単に述語を調べるときに便利です。述語が何を意味するのかを知りたい場合は、最も一般的なクエリ(すべての引数が変数です)を試してください。これは、述語についての詳細を見つけるのに非常に便利であり、コードが非常に多目的でコンパクトになるため、実際には非常に便利です。 – mat