2012-01-21 34 views
6

Tôi đã xem qua đánh giá này số tự nhiên của số logic trong một hướng dẫn và nó được đem lại cho tôi một số nhức đầu:Chuyển đổi số Peano s (N) để nguyên trong Prolog

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

Nguyên tắc khoảng khẳng định rằng: nếu N0 là tự nhiên, nếu không chúng tôi cố gắng gửi nội dung của s/1 trở lại đệ quy đến quy tắc cho đến khi nội dung là 0, thì đó là số tự nhiên nếu không thì không.

Vì vậy, tôi đã kiểm tra việc thực hiện logic ở trên, tự nghĩ, cũng làm việc này nếu tôi muốn đại diện cho s(0) như 1s(s(0)) như 2, nhưng tôi muốn thích để có thể chuyển đổi s(0)-1 để thay thế.

Tôi đã nghĩ đến sự cai trị cơ sở:

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

Vì vậy, đây là câu hỏi của tôi: Làm thế nào tôi có thể chuyển đổi s (0) 1 và s (s (0)) đến 2?

Đã được trả lời

Edit: tôi sửa đổi nguyên tắc cơ bản trong việc thực hiện đó là câu trả lời tôi chấp nhận chỉ cho tôi hướng tới:

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

Vì vậy, tôi bây giờ có thể sử dụng nó như tôi muốn để, cảm ơn tất cả mọi người!

+0

(a) là bài tập về nhà này? (b) Đây là một vấn đề tiêu chuẩn - bạn sẽ có thể tìm thấy nó trong bất kỳ hướng dẫn hoặc sách giáo khoa về lập trình logic. – Marcin

+0

a) Không, tôi chỉ đang cố gắng học Prolog b) Người ta sẽ nghĩ rằng, nhưng tôi đã dành nửa ngày tốt hơn cố gắng tìm câu trả lời cho câu hỏi này để không có ích – shaungus

Trả lời

1

Đây là nhiệm vụ tiêu chuẩn - giải pháp có tại đây: http://www.docstoc.com/docs/82593705/Prolog-%E2%80%93-Family-Tree (trang 109).

Sự thấu hiểu chính là giá trị của s(N) là 1+ giá trị của N, và rằng nếu N là 0, giá trị là 0.

+0

Cảm ơn bạn đã xóa nó, dường như hầu hết rắc rối của tôi là s (N) được gọi là số peano :) – shaungus

+0

@shaungus: Ngay cả khi biết điều đó, tôi thấy khó tìm ra câu trả lời. Trong trường hợp này, sách là bạn của bạn. – Marcin

5

Dưới đây là một giải pháp mà làm việc "cả hai cách" sử dụng library(clpfd) của SWI, YAP, hoặc SICStus

:- use_module(library(clpfd)). 

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

Không problemo với nest_right/4 song song với 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). 

truy vấn mẫu:

?- 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 
Các vấn đề liên quan