Prolog对succ / 2的定义

时间:2010-11-20 17:25:26

标签: prolog

我经常使用SWI-Prolog的功能,能够进行列表(谓词)。看看它如何实现它的一些谓词。我想看看它与succ / 2的作用究竟是什么因为我在SWI-Prolog上使用它但是我需要它与Sicstus一起运行它没有它!我已经看到它在SWI手册中做了什么,试图实现它,但我认为它必须做一些额外的事情,我已经尝试过。我的问题是列表功能只是给出了

%外国人:succ / 2

任何想法的人?

谢谢:)。

2 个答案:

答案 0 :(得分:1)

SWI版本可能在C中实现,以获得更好的性能。不是用Prolog编写的,它就是外来的,可能被认为是内置的

这是我在Prolog中定义SWI的 succ / 2 的尝试:

%%%% succ/2 to mimic the SWI Prolog built-in

succ(N0, N1) :-
    ( properly_grounded(N0) 
        ->  N1 is N0 + 1
        ; properly_grounded(N1)
        ->  N1 > 0, N0 is N1 - 1
        ; otherwise 
        -> Ctx=context(succ/2,''),
          throw(error(instantiation_error,Ctx))
       ).

properly_grounded(X):-
    (var(X) -> false
        ; 
    ( X >= 0
        -> true
        ; otherwise 
    -> Ctx = context(succ/2,X),
        E=domain_error(not_less_than_zero,X),
       throw(error(E,Ctx));otherwise
       )
   ).

如有必要,请将否则替换为 true ,将 false 替换为 fail 。代码是在SWI中开发的, context 部分异常可能需要针对SICStus进行调整。

答案 1 :(得分:0)

这个问题太老了,但这是一个简单的实现,应该与SWI-Prolog中的succ/2具有相同的行为。

succ(X, Y) :- integer(X), Y is X + 1, X >= 0, !.
succ(X, Y) :- integer(Y), X is Y - 1, X >= 0.

我们需要两个规则,因为is的右侧必须完全实例化,并使用integer/1进行检查。