вычислить s-число для натурального числа с помощью Prolog
Я новичок в Prolog и все еще привыкаю к его логике.
У меня есть задача создать функции, которые превращают натуральное число в "S-число" и наоборот.
Итак, номер 0 будет 0
.
Номер 1 был быs(0)
.
Номер 2 был быs(s(0))
.
И так далее.
nat(0).
nat(s(0)):- nat(X).
Функция нахождения натурального числа по заданному S-числу у меня уже есть:
s2nat(0, 0) :- !.
s2nat(s(S),Number) :- s2nat(S,NewNumber), Number is NewNumber + 1.
Так ?- s2nat(s(s(s(0))), X)
даст X=3
как выход.
Теперь мне нужно написать функцию, которая делает обратное: возвращает S-число для данного натурального числа.
И вот я застрял. Я не совсем понимаю, как написать условие, чтобы Пролог понял, что мне нужноs(S)
подлежит возврату. УсловиеNumber is NewNumber + 1
больше не работает, чтобы вернуться и получить "0".
У тебя есть какой-нибудь совет?
1 ответ
На рекурсивном шаге вы можете проверить, Number > 0
, и выполнить рекурсию с помощью Number-1
:
snat(0, 0).
snat(s(S), Number) :-
Number > 0,
Number1 is Number-1,
s2nat(S, Number1).
Мы можем сделать предикат разнонаправленным, например, используя clpfd
библиотека:
:- use_module(library(clpfd)).
snat(0, 0).
snat(s(X), N) :-
N #> 0,
N1 #= N-1,
snat(X, N1).
Таким образом, этот предикат может вычислить представление Пеано числа, вычислить число, которое представляет представление Пеано, проверить, действительно ли данное число Пеано является данным числом, и перечислить все возможные представления Пеано и их соответствующее число:
?- snat(X, 4).
X = s(s(s(s(0)))) ;
false.
?- snat(s(s(0)), N).
N = 2.
?- snat(s(s(0)), 2).
true.
?- snat(s(s(0)), 4).
false.
?- snat(X, N).
X = N, N = 0 ;
X = s(0),
N = 1 ;
X = s(s(0)),
N = 2 ;
X = s(s(s(0))),
N = 3 ;
X = s(s(s(s(0)))),
N = 4