2011-11-29 30 views
5

Tôi đang cố gắng sửa đổi danh sách bằng tìm kiếm và thay thế, tự hỏi làm cách nào để tìm kiếm thông qua danh sách có cụm từ tìm kiếm dưới dạng danh sách?Làm thế nào để bạn thực hiện tìm kiếm và thay thế danh sách với một danh sách phụ khác trong Prolog?

phép nói rằng tôi có một danh sách [1,2,3,4] Tôi muốn duy nhất ra 2 và 3 và thay thế nó bằng 5,6 rất lý tưởng tôi có thể có một vị ngữ:

search_and_replace(Search_Term, Replace_Term, Target_List, Result_List). 

eg. 

search_and_replace([2,3], [5,6], [1,2,3,4], Result_List), write(Result_List). 

Trả lời

4

Bạn có thể sử dụng append/2 như sau:

replace(ToReplace, ToInsert, List, Result) :- 
    once(append([Left, ToReplace, Right], List)), 
    append([Left, ToInsert, Right], Result). 

Có hoặc không sử dụng của một lần/1 tùy thuộc vào việc bạn có muốn tất cả các tiện ích hay không.

Để thay thế tất cả các lần xuất hiện tôi muốn đi với một cái gì đó như:

replace(ToReplace, ToInsert, List, Result) :- 
    replace(ToReplace, ToInsert, List, [], Result). 
replace(ToReplace, ToInsert, List, Acc, Result) :- 
    append([Left, ToReplace, Right], List), 
    append([Acc, Left, ToInsert], NewAcc), 
    !, 
    replace(ToReplace, ToInsert, Right, NewAcc, Result). 
replace(_ToReplace, _ToInsert, [], Acc, Acc). 
+0

Hmm .. Tôi nhận thấy rằng vị từ chỉ tìm kiếm và thay thế một vị trí, làm cách nào để bạn áp dụng cho tất cả các cụm từ trên toàn cầu? – chutsu

+1

@chutsu Tôi đã chỉnh sửa. – m09

+0

Cảm ơn bạn rất nhiều :) – chutsu

6

Hãy để tôi giả sử rằng bạn muốn thay thế một chuỗi con sau đó trong danh sách theo danh sách khác.

Đây là cách tổng quát cách thực hiện việc này. Bạn có thể muốn thêm các điều kiện khác vào chương trình.

replacement(A, B, Ag, Bg) :- 
    phrase((seq(S1),seq(A),seq(S2)), Ag), 
    phrase((seq(S1),seq(B),seq(S2)), Bg). 

seq([]) --> []. 
seq([E|Es]) --> [E], seq(Es). 

Và, điều này có thể được tối ưu hóa một chút - ngay cả thuộc tính chấm dứt của nó sẽ có lợi nhuận. Nhưng khái niệm rõ ràng là một giá trị khá quý ...

Edit: bạn truy vấn Ví dụ:

?- replacement([2,3], [5,6], [1,2,3,4], Xs). 
Xs = [1, 5, 6, 4] ; 
false. 
+2

Rất đẹp, DCG là khá mới mẻ với tôi nhưng nó có vẻ như một giải pháp thanh lịch. – chutsu

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