Версия SWI, вероятно, реализована на C для лучшей производительности. Отсутствие написания на Прологе делает его чужим и, вероятно, считается встроенным .
Вот мой пример определения 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.