2017-11-11 5 views
1

GNU Prologで->演算子を使用しようとしていますが、可変スコープに問題があります。ここでは例です:Prologのif/elseの可変スコープ

プロローグコンソールで
example(A) :- 
    B = A, 
    (B == 2 -> write(B), write(' is 2'), nl); 
    (write(B), write(' is not 2'), nl). 

| ?- example(2). 
2 is 2 

true ? 

yes 
| ?- example(3). 
_282 is not 2 

yes 

私はexample(2)を照会すると、B == 2は成功し、PrologはBの値が何であるかを知っているので、2 is 2を出力します。

example(3)を照会すると、B == 2が失敗し、何らかの理由でPrologがBの値を知らないため、一部の変数_282が出力されます。 B == 2が成功したときにだけPrologがBの値を知っている理由について、私は非常に混乱しています。 ->オペレータを正しく使用していませんか?どんな助けもありがとう。

答えて

2

お客様セミコロン(;)を間違った場所に入れてください。何が書かれていることは構文的に等価です:

example(A) :- 
    ( B=A, 
     ( B==2 
     -> write(B), 
     write(' is 2'), 
     nl 
     ) 
    ; write(B), 
     write(' is not 2'), 
     nl 
    ). 

そうそこに二つの枝はここにある:B == 2ならば、チェックし、あなたがB = Aを設定する1、及びそのような場合には、あなたwrite(B)、新しい行が続くwrite(' is 2')B2でない場合は、そのブランチを使用しますが、if本体(->以降)のコールは呼び出されません。

次はそこwrite(B)完全に別の支店でもありますが、PrologのBがあなたの隣write(' is not 2')、非接地変数であるためので、その枝に、我々は最初のB = Aを通過していないことに注意してください。しかし、_282で表示されるものは、非接地型変数です。

あなたは正しい場所にセミコロンを置くことによってそれを修正することができます:あなたは新しい変数を作成する理由、それは私には明らかではないが、さらに

example(A) :- 
    B = A, 
    ( B == 2 
    -> write(B), 
     write(' is 2'), 
     nl 
    ; write(B), 
     write(' is not 2'), 
     nl 
    ) 
). 

example(A) :- 
    B = A, 
    ( B == 2 
    -> (write(B), write(' is 2'), nl) 
    ; (write(B), write(' is not 2'), nl) 
    ). 

以下冗長最初の場所。

example(A) :- 
    ( A == 2 
    -> write(A), 
     write(' is 2'), 
     nl 
    ; write(A), 
     write(' is not 2'), 
     nl 
    ) 
). 
+0

ありがとう:あなたは直接A作業することができます!あなたの最後の質問に答えるために、私の実際のコードはif/elseステートメントの前にはるかに多くの作業を行います。私は質問のためにすべてを単純化しました。 – applemavs