2011-11-29 18 views
5

Próbuję zmodyfikować listę, wyszukując i zamień, zastanawiałem się, w jaki sposób mogę również przeszukać listę z wyszukiwanym terminem jako listą?Jak wyszukiwać i zamieniać listę na inną podlistę w Prologu?

Umożliwia powiedzieć, że ma listę [1,2,3,4] i ma wyróżnić 2 i 3, i zastąpić go 5,6 więc idealnie mogę mieć orzeczenie:

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

Odpowiedz

4

Można użyć dodać/2 następująco:

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

Z lub bez użycia z raz/1 w zależności od tego, czy chcesz wszystkie możliwości, czy nie.

Aby wymienić wszystkich wystąpień pójdę z czymś takim:

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 .. Zauważyłem, że predykat tylko wyszukuje i zamienia jeden, w jaki sposób stosujesz się do wszystkich terminów na całym świecie? – chutsu

+1

@ Chutsu Edytowałem. – m09

+0

Dziękuję bardzo :) – chutsu

6

Pozwolę sobie założyć, że chcesz zastąpić podciąg pod listą na innej liście.

Oto ogólny sposób, jak to zrobić. Możesz dodać dodatkowe warunki do programu.

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

I tak może to być zoptymalizowane trochę - nawet jego właściwość terminacji skorzystają. Ale koncepcyjny jasność jest wartością dość cenny ...

Edit: Twój przykład zapytania:

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

Bardzo ładny, DCG jest całkiem nowy dla mnie, ale wydaje się, że eleganckie rozwiązanie. – chutsu