2012-04-27 10 views
0

プロローグで、変数を_のインスタンスにする方法はありますか?私はスドクソルバーを作っています。数字(与えられた数字)または - (数字が与えられていない)のいずれかで読み込まれたパズルを表します。だから、パズル全体をリストのリストに読み込んだので、そのリストを関数に渡したいと思い、 ' - 'を_として渡す必要があります。入力を読み取って入力を_として保存するときに何らかの方法がありますか?たとえばのように。Prolog "don't-care"変数

get_next(X) :- 
    repeat, 
    get_char(Y), 
    (Y = '\n' -> fail 
    ; 
    Y = '-' -> X = _ 
    ; 
    X = Y 
). 

このようなものは何ですか?私はおそらく'_'を渡すと思ったが、もちろん、'_' \= _ ...どんな助けでも大歓迎です。プロローグは私にとって非常に異質です。

+0

Prologのアンダースコアは、同じ名前の他の変数と統合されない変数です。それは他の名前付き変数との唯一の違いです。 – dasblinkenlight

+0

私は 'all_different([1、_2,5、_、4、_、8,7])'を呼び出すと真ですが、上記の関数を使って入力を読み込み、 (2): '2/0'はエラーではありませんが、エラーメッセージ 'ERROR:>/2:関数 'である。これを修正するにはどうすればよいですか?私のall_differentを実装しますか? –

+1

私が言ったのは、 'all_different([1、_2,5、_、4、_8,7])'と 'all_different([1、A、2,5、B、4、C、8 、7]) 'はルールの他の場所で' A'、 'B'、' C'を統一しようとしない限り同じです。 – dasblinkenlight

答えて

0

Y = ' - 'のときは、XとYを結合しないでください。それはXをインスタンス化せずに残します(最初はインスタンス化されていないと仮定します)。

get_next(X) :- 
    repeat, 
    get_char(Y), 
    (Y = '\n' -> fail 
    ; 
    Y \= '-' -> X = Y ; true 
). 
+0

リピートが発生する必要があります。それ以外の場合は、 '\ n'が次のローの最初のelemになるため、ループは '\ n'をスキップします。とにかく、このコードを実行すると、 'X = _'をバインドすると同じ結果が得られます。私たちは間違っているのですか?あなたの答えは理にかなっていますが、思うようにはうまくいかないようです。 –

+0

問題の詳細を教えてください。受信した文字がダッシュの場合、この答えのコードはXを無制限にします。 – gusbro