?-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