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