?-mod5(X,[a,16,b,c(5),[[12]],8]).
X = [a,1,b,c(5),[[12]],3].
非整数应保持不变。但是,在[[12]]的情况下,因为12是“\ f”(换页)的ASCII值,所以当我想要输出[[12]]时输出[[“\ f”]]原样。我该如何防止这种情况?
答案 0 :(得分: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 mod 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), !,
第二段中的守护子目标mod5/2
(NU-PROLOG);仅当mod
为数字时才会通过is
通过Y
进行Y
的数字计算以替换mod5
;否则,它会被X
的最后一个条款(作为?- mod5(X,[a,16,b,c(5),[[12]],8]).
X = [a, 1, b, c(5), [[12]], 3] ;
false.
)所触及。
使用SWI-PROLOG在您的示例中执行此操作会给出:
{{1}}