2012-07-18 13 views
16

Jak dodawać listy w prologu? Szukałem w internecie i znalazłem to (od http://www.csupomona.edu/~jrfisher/www/prolog_tutorial/2_7.html)Jak dodawać listy w prologu?

append([X|Y],Z,[X|W]) :- append(Y,Z,W). 
append([],X,X). 

Więc to dostaje się Z usuwając elementy [X|Y] w [X|W]. Ale w jaki sposób mogę dołączyć dwie listy razem?

przykład,

appendlist([1,2],[3,4,5],X). 

Wynik będzie X = [1,2,3,4,5].

Również nie wiem, co dzieje się w rekursji. (I prześledzić go, ale nie rozumiem)

EDIT: Co chcę wiedzieć, jak to powinno być kodowane funkcjonować jak predefiniowanym append() w prologu

Odpowiedz

20

The kod, który opublikowałeś, jest (prawie) OK. Kolejność klauzul prostu musi zostać zamienione (aby uczynić to definicja predykatu produktywny, gdy jest stosowany w generatywnej mody):

append([],X,X).       % your 2nd line 
append([X|Y],Z,[X|W]) :- append(Y,Z,W). % your first line 

ta określa relację pomiędzy trzema argumentami, powiedzmy A, B i C .

Pierwsza linia mówi, "C jest wynikiem dopisywania A i B jeśli A i C są dla pustych list, oboje mają taką samą głowę (czyli pierwszy element), a ogon z C jest wynikiem dołączenia ogona A z tym samym drugim argumentem, B ".

a  a 
    ---------- 
    b  b 
    c  c 
    . d d 
     e e 
     . . 

Pomyśl o tym, ma to sens. To, co robi, chcemy zdefiniować relację append/3 i wiemy, co chcemy, więc po prostu zapisujemy kilka oczywistych faktów na ten temat, które chcemy spełnić, prawa, które muszą przestrzegać, jeśli zechcesz.

Zakładając, że mamy już zdefiniowany kod, jakie prawa musi ono obowiązywać?Oczywiście dołączenie ogona do jakiejś listy z inną listą daje nam ogon wyniku dołączenia pełnej listy do tej drugiej listy.

To definiuje sposób, w jaki "przesuwamy" pierwszą listę. Ale co, jeśli nie ma gdzie się przesuwać? Co jeśli dotarliśmy do końca tej listy? Następnie dotarliśmy do pustej listy, a dołączenie pustej listy z inną listą daje nam tę listę jako wynik. Oczywiście. I to właśnie mówi nam druga linia kodu, mówi: "dodanie pustej listy z inną listą tworzy tę listę jako wynik".

Zadziwiająco, po zapisaniu tych dwóch praw, które musi wykonać append/3, jest to samo, co zapisanie samej definicji.

dodatkowo: to wyjaśnia to z deklaratywnego punktu widzenia; sprawdź numer an answer by m09, który pokazuje go bardziej z operacyjnego punktu widzenia.

9

Ale jak zrobić Dołączam dwie listy razem?

Odpowiedziano własne pytanie: użyć append/3.

Jeśli chcesz dołączyć X i Y i zapisać wynik w Z, robisz

append(X, Y, Z) 

Jeśli na przykład X = [1, 2] i Y = [3, 4, 5] następnie Z będzie związana [1, 2, 3, 4, 5]:

| ?- append([1,2],[3,4,5], X). 

X = [1,2,3,4,5] 

yes 
| ?- 
+1

Och, mam na myśli to, jak mogę go zakodować, który będzie działał podobnie jak append() prologu – Zik

+5

Kodujesz to w ten sam sposób jak 'append' jest kodowany !? Już odkryłeś implementację (to pierwsze dwa wiersze kodu w twoim pytaniu). – aioobe