2010-11-03 158 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