2016-09-21 15 views
1

私はプロローグにはとても新しいです。できるだけ短い時間でできるだけ多くのことを学びたい。どんな助けでも大歓迎です。私は途中でMacOS Sierraを使用しています。Prolog Wrong Compilation?

私は入力にこれらの行しようとしています:私は、プロローグコマンドウィンドウを使用してテストし、このコマンドを実行すると

nextto(_A,_B). 
nextto(_B,_C). 

を:

?- nextto(A,C). 

はそれがfalseを返すことになっていませんか?

このように、本当の私のコンパイル結果、ので:プロローグ_

?- nextto(A,C). 
true 
+0

私はNextを押し(A、ようにコーディングする必要がありますC)。偽です。 – SAN

+0

これはnextto(A、C)では可能ではないと思います。代わりにnextto(a、c)を使うのはどうですか? – coder

+0

さようなら!どうもありがとうございます!!好奇心から不思議に思っているので、大文字でこれを達成する方法はありませんか? – SAN

答えて

1

そう_A、大文字のようなものであると考えられ、それが匿名の変数を指定することで、独自の特別な意味を持っています、 _Bは(匿名の​​)変数です(プロローグで始まるものは変数であり、アトムではありません)。あなたの句:

nextto(_A,_B). nextto(_B,_C). 

実際には、述語nexxtoは2つの変数で成功することを意味します。だからあなたがneexto(A、C)を照会するとき。真を返します。 nextto(a、b)に問い合わせると、trueを返します。ここで、a、bは原子であり変数ではない。節nextto(a、b)があるかどうか調べるためである。あなたの句で。しかし、私が上で述べたように、あなたの句は_A、_Bのすべての統一で成功します。常に成功nexxtoまた、あなたの述語ので、あなたも一つだけ句を書いても同じ結果になるだろう:

nextto(_A,_B). 

の代わり:

nextto(_A,_B). nextto(_B,_C). 
+0

'_'は実際に大文字とは見なされません。この文脈では、匿名変数を指定する独自の特別な意味を持ちます。つまり、プロローグにその価値について気にしないことを伝えることができます。たとえば、 'foo(_A).'は*シングルトン変数*警告を生成しませんが、' foo(A).'は生成します。 – lurker

+0

はい、あなたは絶対に正しいです、私はそれが変数のように振る舞い、決してそれを指していただきありがとうございました!私は答えを編集して、その部分でより明確になる... – coder