Преобразовать число Пеано s (N) в целое число в прологе - PullRequest
6 голосов
/ 21 января 2012

Я натолкнулся на эту оценку натуральных чисел логических чисел в учебнике, и у меня возникла головная боль:

natural_number(0).
natural_number(s(N)) :- natural_number(N).

Правило примерно гласит, что: если N равно 0, это естественно, если мы не пытаемся рекурсивно отправлять содержимое s/1 обратно в правило, пока содержимое не станет 0, тогда это натуральное число если нет, то это не так.

Итак, я протестировал вышеуказанную логику, подумал про себя, ну, это работает, если я хочу представить s(0) как 1 и s(s(0)) как 2, но я бы хотел иметь возможность преобразовать * Вместо 1014 * 1.

Я подумал о базовом правиле:

sToInt(0,0). %sToInt(X,Y) Where X=s(N) and Y=integer of X

Итак, вот мой вопрос : Как я могу преобразовать s (0) в 1 и s (s (0)) в 2?

Ответили

Редактировать: Я изменил базовое правило в реализации, на которое указал ответ, который я принял:

decode(0,0). %was orignally decode(z,0).
decode(s(N),D):- decode(N,E), D is E +1.

encode(0,0). %was orignally encode(0,z).
encode(D,s(N)):- D > 0, E is D-1, encode(E,N).

Так что теперь я могу использовать его, как я хотел, спасибо всем!

Ответы [ 3 ]

5 голосов
/ 28 июля 2012

Вот еще одно решение, которое работает «в обе стороны», используя library(clpfd) SWI, YAP или SICStus

:- use_module(library(clpfd)).

natsx_int(0, 0).
natsx_int(s(N), I1) :-
   I1 #> 0,
   I2 #= I1 - 1,
   natsx_int(N, I2).
3 голосов
/ 03 июня 2015

Нет проблем с nest_right/4 в тандеме с Пролог лямбда !

:- use_module(library(lambda)).
:- use_module(library(clpfd)).

:- meta_predicate nest_right(2,?,?,?).
nest_right(P_2,N,X0,X) :-
   zcompare(Op,N,0),
   ord_nest_right_(Op,P_2,N,X0,X).

:- meta_predicate ord_nest_right_(?,2,?,?,?).
ord_nest_right_(=,_,_,X,X).
ord_nest_right_(>,P_2,N,X0,X2) :-
   N0 #= N-1,
   call(P_2,X1,X2),
   nest_right(P_2,N0,X0,X1).

Примеры запросов:

?- nest_right(\X^s(X)^true,3,0,N).
N = s(s(s(0))).                 % succeeds deterministically

?- nest_right(\X^s(X)^true,N,0,s(s(0))).
N = 2 ;                         % succeeds, but leaves behind choicepoint
false.                          % terminates universally
1 голос
/ 21 января 2012

Это стандартная задача - решение здесь: http://www.docstoc.com/docs/82593705/Prolog-%E2%80%93-Family-Tree (стр. 109).

Главное понимание состоит в том, что значение s(N) равно 1+, значение N, а если N равно 0, значение равно 0.

...