2012-01-21 40 views
6

me encontré con esta evaluación número natural de números lógicos en un tutorial y me ha estado dando algunos dolores de cabeza:convertir número Peano s (n) de número entero en Prolog

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

La regla más o menos precisa que: si N es 0 es natural, si no tratamos de enviar el contenido de s/1 recursivamente a la regla hasta que el contenido sea 0, entonces es un número natural si no, entonces no lo es.

Así que probó la aplicación lógica anterior, pensé para mí, esto funciona bien si quiero representar s(0) como 1 y s(s(0)) como 2, pero Me gustaría ser capaz de convertir a s(0)1 lugar.

he pensado en la regla de base:

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

Así que aquí está mi pregunta: ¿Cómo puedo convertir s (0) a 1 y S (s (0)) a 2?

ha sido contestada

Editar: he modificado la regla de base en la aplicación, que la respuesta acepté me señaló hacia:

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). 

Así que ahora puedo usarlo como quería para, gracias a todos!

+0

(a) ¿Es esta tarea? (b) Este es un problema estándar: debería poder encontrarlo en cualquier tutorial o libro de texto sobre programación lógica. – Marcin

+0

a) No, solo estoy tratando de aprender Prolog b) Uno pensaría eso, pero he pasado la mitad de un día tratando de encontrar una respuesta a esta pregunta en vano – shaungus

Respuesta

1

Esta es una tarea estándar; la solución está aquí: http://www.docstoc.com/docs/82593705/Prolog-%E2%80%93-Family-Tree (página 109).

La idea clave es que el valor de s(N) es 1+ el valor de N, y que si N es 0, el valor es 0.

+0

Gracias por aclarar eso, parece que la mayor parte de mi problema fue que s (N) se llama un número peano :) – shaungus

+0

@shaungus: Incluso sabiendo eso, me resultó difícil buscar una respuesta. En este caso, los libros son tu amigo. – Marcin

5

Aquí hay otra solución que funciona en ambos sentidos "" usando library(clpfd) de SWI, YAP, o SICStus

:- use_module(library(clpfd)). 

natsx_int(0, 0). 
natsx_int(s(N), I1) :- 
    I1 #> 0, 
    I2 #= I1 - 1, 
    natsx_int(N, I2). 
2

No hay problema connest_right/4 en tándem con Prolog lambdas!

:- 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). 

consultas de ejemplo:

?- 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 
Cuestiones relacionadas