prolog打印列表

时间:2010-11-03 17:45:18

标签: ascii prolog

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

非整数应保持不变。但是,在[[12]]的情况下,因为12是“\ f”(换页)的ASCII值,所以当我想要输出[[12]]时输出[[“\ f”]]原样。我该如何防止这种情况?

1 个答案:

答案 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}}