2012-01-21 19 views
6

natknąłem tej naturalnej oceny liczby numerów logicznych w samouczku i to już daje mi ból głowy:Konwersja number Peano S (N) do liczby całkowitej w Prologu

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

Reguła grubsza stwierdza, że: jeśli N to jest 0 jest to naturalne, jeśli nie, staramy się wysłać zawartość s/1 z powrotem rekursywnie do reguły, dopóki treść nie jest 0, to jest to liczba naturalna, jeśli nie, to nie jest.

Więc przetestowany powyższą realizację logiki, pomyślałem, dobrze to działa, jeśli chcę reprezentować s(0) jak 1 i s(s(0)) jako 2, ale ja bym chciał być w stanie przerobić s(0) do 1 zamiast.

Ive myśl reguły bazowej:

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

Więc tutaj jest moje pytanie: Jak mogę przekonwertować S (0) do 1 i S (S (0)) do 2?

zostało odebrane

Edycja: I zmodyfikowane reguły bazowej w realizacji których odpowiedź przyjąłem wskazał mi w kierunku:

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

Więc mogę teraz używać go jak chciałem dzięki, dziękuję wszystkim!

+0

(A) jest to praca domowa? (b) Jest to standardowy problem - powinieneś być w stanie znaleźć go w dowolnym samouczku lub podręczniku programowania logicznego. – Marcin

+0

a) Nie, ja tylko próbuję się nauczyć Prologu b) Można by pomyśleć, ale spędziłem lepszą połowę dnia próbując znaleźć odpowiedź na to pytanie bezskutecznie. – shaungus

Odpowiedz

1

Jest to standardowe zadanie - rozwiązanie jest tutaj: http://www.docstoc.com/docs/82593705/Prolog-%E2%80%93-Family-Tree (strona 109).

Kluczowym spostrzeżeniem jest, że wartość s(N) jest 1+ wartość N, i że jeśli N wynosi 0, wartość jest 0.

+0

Dziękuję za wyjaśnienie tego, wydaje mi się, że większość moich kłopotów polegała na tym, że s (N) jest nazywane numerem peano :) – shaungus

+0

@shaungus: Nawet wiedząc o tym, trudno było znaleźć odpowiedź. W takim przypadku książki są twoimi przyjaciółmi. – Marcin

5

Oto kolejne rozwiązanie, które działa "w obie strony" za pomocą library(clpfd) z SWI, Yap, lub 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 problemo z nest_right/4 w tandemie z 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). 

Przykładowe pytania:

?- 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 
Powiązane problemy