2012-02-19 46 views
10

Ai đó có thể giúp tìm lỗi trong quy tắc này không?Kết hợp Danh sách trong Prolog

concat([], List, List). 
concat([Head|[]], List, [Head|List]). 
concat([Head|Tail], List, Concat) :- concat(Tail, List, C), concat(Head, C, Concat). 

Đang cố gắng để nối 2 danh sách thất bại:

| ?- concat([1,2], [4,7,0], What). 

no 

Trả lời

14

Để khắc phục mã của bạn, cách bạn dự định nó, bạn chỉ cần chuyển đổi Head vào [Head] trong cuộc gọi cuối cùng của bạn để concat/3 tại khoản cuối cùng của bạn . Vấn đề là bạn đã gọi vị từ của bạn chỉ với một đối số đầu tiên, không phải là một danh sách.

Mặc dù, đây là một số lưu ý:

  • [Head|[]] tương đương với [Head]
  • thuật toán của bạn có một độ phức tạp nghèo, n! Tôi tin.
  • không cắt theo sau mệnh đề thứ hai, bạn tạo điểm chọn vô hạn thông qua lệnh gọi mệnh đề thứ ba của bạn với danh sách độ dài 1 (do đó gọi mệnh đề thứ hai của bạn, sau đó được chạy qua mệnh đề thứ ba của bạn, v.v. vòng lặp vô hạn).

Đây là phiên bản SWI-pl, để gợi ý bạn hướng tới đệ quy prolog tốt:

append([], List, List). 
append([Head|Tail], List, [Head|Rest]) :- 
    append(Tail, List, Rest). 

Bạn có thể tìm các nguồn lực khác vào bài viết gần đây đây hoặc tại Learn Prolog Now! hướng dẫn, nếu bạn muốn tìm hiểu làm thế nào để sử dụng đệ quy đúng.

+0

Cảm ơn vì đã giúp. Một câu hỏi nữa: liệu có thể xem prolog giải thích chương trình như thế nào? ví dụ, theo dõi ngăn xếp có thể giúp xem vấn đề. – damluar

+3

yup, nhập 'trace.'. Bạn sẽ nhập chế độ theo dõi. Để rời khỏi nó, hãy nhập 'notrace'. Bạn sẽ ở chế độ gỡ lỗi. Để thoát chế độ gỡ lỗi, nhập 'nodebug.' và bạn sẽ trở lại chế độ bình thường! – m09

+0

Tôi sử dụng gnu prolog, nó hoạt động cho tôi. cảm ơn! – damluar

4

Có thể thực hiện bằng cách sử dụng phụ thêm.

concatenate(List1, List2, Result):- 
    append(List1, List2, Result). 

Hy vọng điều này sẽ hữu ích.

0

Đây là nối giữa quy tắc hai danh sách:

concat([],L2,L2). concat([Head|Tail],L2,[Head|L3]) :- concat(Tail,L2,L3). 
Các vấn đề liên quan