вычислить s-число для натурального числа, используя 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».

У тебя есть какой-нибудь совет?


person Wonderaleks    schedule 10.04.2020    source источник
comment
Вы пишете комментарий вроде sick logic, а потом ждете помощи?   -  person Guy Coder    schedule 10.04.2020
comment
если Number is NewNumber + 1 работает для повышения от 0, NewNumber is Number - 1 будет работать для снижения до 0.   -  person Will Ness    schedule 10.04.2020


Ответы (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 
person Willem Van Onsem    schedule 10.04.2020
comment
большое спасибо! Моя ошибка была с Number1 is Number-1 . Я тупо пытался поставить его в конце как в первый раз. Большое спасибо, в начале это определенно помогает получить удар сбоку. - person Wonderaleks; 10.04.2020