2016-08-03 12 views
5

Tôi mới trong prolog và tôi đang cố gắng để viết vị encode(L,L1) mà đếm các bản sao của các yếu tố trong L, ví dụ:ngữ mã hóa trong prolog

encode([4,4,4,3,3],L). 

L=[3,4,2,3]. 

Đây là những gì tôi đã viết:

encode(L,L1) :- encode(L,1,L1). 

encode([],_,[]).  
encode([H],N,[N,H]).  
encode([H,H|T],N1,[N,H|T1]) :- M is N1+1, encode([H|T],M,[N,H|T1]).  
encode([H,Y|T],N,[N,H|T1]) :- H\=Y, encode([Y|T],T1). 

Vị từ trên không thể đảo ngược. Nó chỉ hoạt động nếu tham số đầu tiên được cung cấp.

Tôi làm cách nào để viết mã có thể hoàn nguyên?
Ví dụ:

encode(L,[3,4,2,3]).   
L = [4,4,4,3,3]. 
+0

Thay cho 'M là N1 + 1', hãy thử' M # = N1 + 1'. Hãy chắc chắn rằng bạn tải mô-đun CLP (FD) (': - use_module (thư viện (clpfd)).') Và thay cho '\ =' sử dụng '\ =='. – lurker

+0

@ lurker, tôi đã thử ở trên nhưng vẫn sau khi thực hiện các thay đổi, vấn đề vẫn còn: mã hóa (L, [3,4,2,3]) không đưa ra bất kỳ câu trả lời nào (nó ném ngoại lệ "Ra khỏi ngăn xếp cục bộ"). – coder

Trả lời

4

Tôi nghĩ rằng thuật toán của bạn có một bộ đếm dư thừa trong đó. Một chút đơn giản hóa sẽ là:

encoded([], []). 
encoded([X], [1,X]). 
encoded([X,Y|T], [1,X|R]) :- 
    dif(X, Y), 
    encoded([Y|T], R). 
encoded([X,X|T], [N,X|R]) :- 
    N #> 1, 
    N #= N1 + 1, 
    encoded([X|T], [N1,X|R]). 

Lưu ý trong điều khoản cuối cùng, chúng tôi cần đảm bảo rằng N cũng lớn hơn 1.

+0

Cảm ơn rất nhiều !! đã làm việc !!! – coder

+1

@coder: lưu ý rằng ngay cả 'được mã hóa (Xs, [2, V]).' Tạo ra một câu trả lời hoàn hảo! – false

+1

@coder: Và thậm chí là 'được mã hóa (Xs, [2, V, 2, W]). '! Bạn có thấy 'dif' trong câu trả lời đầy đủ không? – false

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