2011-11-19 27 views
7

Tôi đã cố gắng để tìm hiểu Prolog, và hoàn toàn stumped về những gì các vị từ s() không. Tôi thấy nó được sử dụng thường xuyên và có rất ít tài nguyên trên internet về Prolog mà tôi không thể tìm thấy câu trả lời.Vị từ s() làm gì trong Prolog?

Ví dụ:

/* sum(Is,S) is true if S is the sum of the list of integers Is.   */ 
    sum([],0). 
    sum([0|Is],S):-sum(Is,S). 
    sum([s(I)|Is], s(Z)):-sum([I|Is],Z). 
+0

Phiên bản trình thông dịch prolog nào bạn sử dụng? –

+0

Tôi sử dụng: SWI-Prolog phiên bản 5.10.1 cho amd64 – okin33

Trả lời

14

s/1 không tự làm bất kỳ điều gì, và nó không thực sự là một biến vị ngữ. Họ chỉ là những thuật ngữ, một đại diện của người thừa kế lập luận của họ. Vì vậy, s(0) được sử dụng để đại diện cho người kế thừa của 0 (ví dụ: 1), s(s(0)) được sử dụng để đại diện cho người kế thừa của s(0) (ví dụ: 2), v.v. Chúng rất phổ biến trong Prolog bởi vì Prolog là một ngôn ngữ khá tốt để thực hiện tính toán biểu tượng, trong khi các phép toán số học đơn giản cảm thấy khó khăn, có nghĩa là chúng không được tích hợp liền mạch với mô hình lập trình.

+8

độc đáo nói, + s (0) XD –

+1

Điều này giải thích, rất tốt, tại sao đầu ra của chương trình của tôi bằng cách sử dụng s/1 là rất lạ. Cảm ơn bạn rất nhiều, lời giải thích tuyệt vời! – okin33

1

s/1 là viết tắt của người kế nhiệm. Nó được sử dụng để biểu diễn các con số theo một cách có thể truy cập một cách hợp lý.

+1

Điều đó có ý nghĩa cảm ơn bạn rất nhiều! Tuy nhiên khi tôi thử chạy một số chương trình sử dụng s/1 tôi nhận được đầu ra lạ ở dạng: ? - mycount (a, [a, a], N). N = s (s (0)); N = s (0); N = s (0); N = 0; sai. – okin33

0

Đó là cách thực hiện Prolog cụ thể. Nó đề cập đến một vị từ kế thừa, xem this để biết thêm thông tin

+1

's (X)' không thực hiện cụ thể. Đó là một functor tùy ý. Hãy thử 't (X)' hoặc 'succ (X)' ở vị trí của nó. – false

Các vấn đề liên quan