?-mod5(X,[a,16,b,c(5),[[12]],8]).
X = [a,1,b,c(5),[[12]],3].
非整數應保持不變。然而,在[[12]]的情況下,因爲12是「\ f」(換頁)的ASCII值,所以當我想輸出[[12]]時輸出[[「\ f」]]原樣。我怎樣才能防止這一點?prolog打印列表
?-mod5(X,[a,16,b,c(5),[[12]],8]).
X = [a,1,b,c(5),[[12]],3].
非整數應保持不變。然而,在[[12]]的情況下,因爲12是「\ f」(換頁)的ASCII值,所以當我想輸出[[12]]時輸出[[「\ f」]]原樣。我怎樣才能防止這一點?prolog打印列表
編輯:起初,我認爲問題是與實施,這就是爲什麼我建議在下面。原來,由於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.
@Kaarel: 「家庭作業標籤,像其他所謂的 '元' 標籤,現在氣餒,」(HTTP:/ /meta.stackoverflow.com/q/10812),但@sher請遵循[通用指南](http://tinyurl.com/so-hints),陳述任何特殊限制,顯示迄今爲止您嘗試的內容,並詢問具體是什麼讓你感到困惑。 – 2010-11-08 20:51:50