2012-10-31 18 views
7

Próbuję dodać jeden element do końca listy w prologu, ale nadal kończy się niepowodzeniem.Jak dodać do końca listy w prologu

insertAtEnd(X,[ ],[X]). 
insertAtEnd(X,[H|T],[H|Z]) :- insertAtEnd(X,T,Z).  

letters([a,b,c]). 

Nie rozumiem, dlaczego poniższy opis nie działa.

insertAtEnd(d,letters(Stored),letters(Stored)). 

Ja również próbuje zapisać tę listę w zmiennej przechowywanej przez cały czas, ale nie jestem pewien, czy powyższe jest prawidłowy sposób postępowania.

+0

Konieczność wstawienia elementu na końcu listy zdecydowanie sugeruje, że zajrzysz do * list różnicowych *, które dadzą ci wstawkę O (1). –

Odpowiedz

3

Prolog implementuje model obliczeniowy relacyjny, a zmienne mogą być tworzone tylko, nieprzypisane. Spróbuj

?- letters(Stored), 
    insertAtEnd(d, Stored, Updated), 
    write(Updated). 
+0

Czyli oryginalna lista nie jest edytowalna? Powiedzmy, że otrzymuję inną literę e, musiałbym wywołać insertAtEnd (e, zaktualizowany, zaktualizowany). Próbuję użyć predykatu, aby zaktualizować listę bez konsoli. – MeowMeow

+1

Tak, to niezwykły sposób wykonywania obliczeń. Jest ściśle związany z programowaniem deklaratywnym. Prolog odnajduje obowiązujące zmienne wiążące reguły, gdy musi znaleźć alternatywne rozwiązania, zaczyna cofać wcześniej ustanowione wiązania. – CapelliC

1

można użyć append i umieścić swoją pozycję jako drugiej listy

tak:

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

+0

Chociaż może to być cenna wskazówka, aby rozwiązać problem, odpowiedź musi być naprawdę bardziej szczegółowa. Proszę [edytuj], aby wyjaśnić, w jaki sposób rozwiąże to problem. Ewentualnie rozważ zastąpienie tego komentarza. –

Powiązane problemy