2017-01-21 7 views
1

シンボルから数値をソートするプログラムを作成しましたが、それは動作しますが、最後まで実行しなかったリストの最後にメモリアドレスを与えます。どうしてこんなことに?SWI-Prologのリストの最後のインスタンス化されていない変数

separate([],[],[]). 
separate([X],X,_):-number(X). 
separate([X],_,X). 
separate([X|Y],[X|Z],S):-number(X),separate(Y,Z,S). 
separate([X|Y],Z,[X|S]):-separate(Y,Z,S). 

?- separate([3,a,b,4,5,c],X,Y).

と相談私が取得する:あなたがseparate([],[],[])として、端末句とseparate([X|Y],[X|Z],S)などの通常の句のカップルを持っている場合、私は

separate([],[],[]). 

separate([H | T], [H | Tn], Ls) :- 
    number(H), 
    separate(T, Tn, Ls). 

separate([H | T], Ln, [H | Ts]) :- 
    \+ number(H), 
    separate(T, Ln, Ts). 

を提案

X = [3, 4, 5|_G2592], 
Y = [a, b, c] . 
+0

答えを見てから「Enter」を押す代わりに、スペースバーを押すとどうなりますか? See:SWI-Prologはなぜ私に最初の答えしか与えないのですか?(http://stackoverflow.com/q/34463248/1243762) –

+0

これは、Prologを初めて学ぶときに、 'X'や' Y 'Digit'、' Letter'、 'Digits'、' Letters'、 'Rest'など、より意味のある名前があります。何が起こっているのか理解したら、 'X'や' Y'などに戻すことができます。 –

答えて

1

 
separate([X],X,_):-number(X). 
separate([X],_,X). 

事がある:

separate([],[],[]). 
separate([X|Y],[X|Z],S):-number(X),separate(Y,Z,S). 
separate([X|Y],Z,[X|S]):-separate(Y,Z,S). 

この:あなたが実際にこれらのステートメントを記述する必要はありません、あなたはそれらを省略している可能性がを処理しましたが、複数の結果を返します最初のものを除いて、残りのすべては間違ってです。あなたは最後の節にガードを追加することによってこの問題を解決する必要があります

 
separate([],[],[]). 
separate([X|Y],[X|Z],S):-number(X),separate(Y,Z,S). 
separate([X|Y],Z,[X|S]):-\+ number(X),separate(Y,Z,S). 

「ない」プロローグはnumber(X)と一致しないことができる場合\+ number(X)が成功するという意味のよう\+行為。

最終的には、実際にはメモリアドレスではないことがわかります。これは単にインスタンス化されていない変数ですが、これは些細なことでもあります。

+0

メモリアドレスかどうかは確かではありませんでしたが、あまりにも。 \ +私にはわかりませんし、スクリプトでは一度も言及されませんでした。 – Streamline

+0

@ストリームライン:ah '\ +'は "not"のように振る舞います(それは危険ですが)。 Prologが 'number(a)'と一致しない場合、 '\ + number(a)'は成功するという意味ではありません。 –

2

separate([X|Y],Z,[X|S])、あなたはセミターを必要としませんminal節はseparate([X],X,_)separate([X],_,X)であり、それらは(未定義値_で)リストの1つを避け、 "メモリアドレス"(統合されていない変数の識別子)を取得します。

number(X)という句がある場合、もう一方の(代替)句には「番号なし」チェック(つまり\+ number(X))が必要です。そうでない場合は、両方の句が真であり、解を掛けます。数字ではありません。あなたがオープンリストの尾を残しためだ

関連する問題