Пролог определение succ / 2 - PullRequest
       1

Пролог определение succ / 2

2 голосов
/ 20 ноября 2010

Я часто использовал функцию SWI-Prolog, позволяющую составлять списки (предикаты).чтобы увидеть, как он реализует некоторые из своих предикатов.Я хочу увидеть, что именно он делает с succ / 2, потому что я использую его на SWI-Prolog, но мне нужно, чтобы он также работал с Sicstus, у которого его нет!Я видел, что он делает в руководстве по SWI, пытался реализовать его, но я думаю, что он должен сделать что-то дополнительно к тому, что я пробовал.Моя проблема в том, что функция листинга просто дает

% иностранного: succ / 2

Любые идеи, ребята?

Спасибо :)).

Ответы [ 2 ]

1 голос
/ 20 ноября 2010

Версия 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.

0 голосов
/ 18 июня 2019

Этот вопрос очень старый, но вот простая реализация, которая должна иметь то же поведение, что и succ/2 в SWI-Prolog.

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...