2017-09-04 16 views
0

私は、次のしているプログラム:クエリ、次の理由SWIをプロローグバグ奇妙な出力

filter([],_What,[]). 

filter(List,What,Output):- 
    not(select(What-Val,List,Rest)), 
    filter([],What,Output). 

filter(List,What,[Val|Output]):- 
    select(What-Val,List,Rest), 
    filter(Rest,What,Output). 

は、私は理解していませんSWI-prolog(7.4.2)、MacとEl Captain(10.11.6)があります。

私はguitracerを試してみましたが、リスト[90,80,80]を作成しますが、 "ZPP"を出力します なぜそれがそれをするのかわかりません。

SWISHオンラインプロローグ出力[90,80,80]なので、SWI-Prologで何かでなければなりません。

EDIT

は、なぜそれがこれを行うん...それは文字になど90 = Z、80 = Pを、数に変換しているようですか?それがロードされてしまったが、この動作はportray_text(true)によってトリガすることができますどのように伝えるのは難しい

+2

はい、SWI Prologでは、「ZPP」は、 'Z'、' P'、 '' P'のコードの「文字列」(リスト)を表します。彼らは同等です。 '[90、80、80]'を文字列として表示するには、SWI Prologがどのモードに設定されているのか不明です。おそらくもっと重要なのは、少なくとも2つのシングルトン変数があり、クエリが終了しないことです(無限に 'Output = [90、80、80]'という解を生成します)。 – lurker

答えて

1

6 ?- A = [90,80,80]. 
A = [90,80,80]. 

7 ?- portray_text(true). 
true. 

8 ?- A = [90,80,80]. 
A = "ZPP". 

考え方は、文字コードのリストとしてテキストを処理する場合は、出力が読みにくいということです。 portray_text/1は、 文字コードのリストとして整数リストを解釈しようとするportray/1フックを有効にし、成功すると結果を文字列として出力します。

これを行うためにGUIトレーサを設定することはできますが、これはデフォルトではないと思います。

+0

これは問題だと思われますが、それをtrueに設定してもMacでは動作しません。それでも数字は出力されます。私はWindowsのswi-prologでそれをテストし、portray_text(true)が正しく入力されたら文字を出力します。 – Teaman

+0

私のMacでうまく動作します。この機能の移植性は、この質問とは無関係です。新しい質問を開始し、詳細(バージョン、バイナリからインストール、Macports、自作など)を端末やアプリなどで使用する –