2010-11-03 211 views
0
?-mod5(X,[a,16,b,c(5),[[12]],8]). 
X = [a,1,b,c(5),[[12]],3]. 

非整數應保持不變。然而,在[[12]]的情況下,因爲12是「\ f」(換頁)的ASCII值,所以當我想輸出[[12]]時輸出[[「\ f」]]原樣。我怎樣才能防止這一點?prolog打印列表

+0

@Kaarel: 「家庭作業標籤,像其他所謂的 '元' 標籤,現在氣餒,」(HTTP:/ /meta.stackoverflow.com/q/10812),但@sher請遵循[通用指南](http://tinyurl.com/so-hints),陳述任何特殊限制,顯示迄今爲止您嘗試的內容,並詢問具體是什麼讓你感到困惑。 – 2010-11-08 20:51:50

回答

1

編輯:起初,我認爲問題是與實施,這就是爲什麼我建議在下面。原來,由於OP已經後來得知,這是NU-Prolog的,這個答案似乎只是橫亙在NU-Prolog默認行爲,如per this manual, section 3.7

「名單通常如果每一個元素打印爲字符串的列表是一個整數,isPrint/1爲真。「

作爲isPrint/1被表示爲一個內置的NU-Prolog的,有可能它可以不被覆蓋,以提供其他行爲 - 也許NU-Prolog的可被配置成改變在這種情況下,缺省行爲,但我不確定。

下面是mod5/2的實現,這是現在無關的解決方案:


如果斷言mod5/2取意(作爲第二個參數)的術語列表,和返回(在第一個參數位置)以相同的順序術語列表,但如果每N替換爲N模5的值數,那麼我建議你試試:

mod5([], []). 
mod5([X|Xs], [Y|Ys]) :- 
    isInt(Y), !, 
    X is Y mod 5, 
    mod5(Xs, Ys). 
mod5([X|Xs], [X|Ys]) :- 
    mod5(Xs, Ys). 

注意保護子目標isInt(Y), !,(NU-PROLOG )在s中mod5/2的第二個子句; mod通過is代替Y的數值計算將只會發生iff Y是數字;否則,它將通過mod5的最後一個子句(作爲X)不變。

使用SWI-PROLOG你的榜樣執行此給出:

?- mod5(X,[a,16,b,c(5),[[12]],8]). 
X = [a, 1, b, c(5), [[12]], 3] ; 
false. 
+0

我正在做類似的事情。如果這個元素是一個數字,那麼它會被修改,否則我會保持它不變。我正在使用NU prolog,您的解決方案不起作用。除[[\ f]]之外,輸出與輸入相同。其中X = [a,16,b,c(5),[「\ f」],8]; – sher 2010-11-04 05:06:19

+1

mod未在所有數字上定義:您想用整數/ 1替換數字/ 1 – Kaarel 2010-11-04 12:21:27

+0

@Kaarel;你是對的,我會做一個編輯。 – sharky 2010-11-04 19:43:10