2017-09-04 55 views
0

我有以下程序:束縛水飽和度,序言錯誤怪異輸出

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). 

我不明白,爲什麼下面的查詢:

filter([age-90, age-80,age-80],age,Output). 

輸出:

Output = "ZPP" 

我有最新版本SWI-prolog(7.4.2),並與El Captain(10.11.6)一起使用。

我已經嘗試過guitracer,它建立了列表[90,80,80],但輸出「ZPP」 我不知道它爲什麼這樣做。

SWISH在線prolog輸出[90,80,80],所以它必須是SWI-Prolog。

編輯

看來,將其轉換成數字字符90 = Z,80 = P,等等

它爲什麼要這樣做呢?

+2

是的,在SWI Prolog中,''ZPP「'代表'Z','P'和'P'的代碼的」字符串「(列表)。所以它們是等價的。不知道你的SWI Prolog設置爲什麼模式會導致默認顯示'[90,80,80]'爲字符串。也許更重要的是,你至少有兩個單例變量,並且你的查詢不會終止(無限地產生解決方案Output = [90,80,80]')。 – lurker

回答

1

很難說這是怎麼裝的,但這種行爲可以通過portray_text(true)觸發:

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

7 ?- portray_text(true). 
true. 

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

的想法是,如果你處理文本的字符代碼列表的輸出是難以閱讀。 portray_text/1啓用描述/ 1鉤子,試圖將 整數列表解釋爲字符代碼列表,如果成功,則將結果作爲字符串輸出。

GUI跟蹤器可以配置爲執行此操作,但我不認爲這是默認設置。

+0

這似乎是問題所在,將它設置爲true不適用於mac,它仍會輸出數字。我在windows swi-prolog上測試了它,並在portray_text(true)時正確輸出字符。 – Teaman

+0

在我的Mac上正常工作。這個功能的可移植性也與這個問題無關。開始一個新的問題,並提供詳細信息(版本,從二進制,Macports,Homebrew等安裝在終端或作爲應用程序等使用) –