2011-01-10 17 views
6

Witam Próbuję wstawić element na liście, ale z mojego programu bardzo ważne jest, aby wynik był zapisany na oryginalnej liście, a nie w nowej.
Każdy kod napisany lub znaleziony w Internecie kończy się powodzeniem, jeśli utworzysz nową listę, w której zostanie zachowany wynik końcowy.
Moje pytanie brzmi: czy ktoś może mi powiedzieć, jak zdefiniować funkcję: wstawić (X, L), gdzie X jest elementem, a L to lista?wstaw element do listy i zwróć tę samą listę zaktualizowaną

+0

Jeśli chcesz zaktualizować listę w miejscu, to próbujesz myśleć zbyt wolno. Czy możesz opisać problem, który chcesz rozwiązać bardziej szczegółowo? – Juliet

Odpowiedz

3

Nie, Prolog po prostu nie działa w ten sposób. Nie ma czegoś takiego jak "modyfikowanie" wartości. Zmienna może zostać ujednolicona z określoną wartością, ale jeśli była już [1,3], później nie będzie już dostępna.

2

Jak mówi aschepler, nie można dodawać ani wprowadzać żadnych zmian do właściwej listy, tj. Listy, w której każdy element jest już powiązany. Jedyne "modyfikowanie", które możemy zrobić, to jednoczyć jedno wyrażenie z drugim.

Istnieje jednak pojęcie częściowej listy, do której na końcu można dodać "dodatkowe elementy". Jest to zwykle znane jako lista różnic, chociaż nomenklatura ta może nie być od razu zrozumiała.

Załóżmy, że zaczynamy, nie z pustą listą, ale z wolną zmienną X. Można jednak pomyśleć o odjęciu X od X i otrzymaniu "nic". Oznacza to, że pusta lista różnic jest reprezentowana przez X - X. Minus "-" tutaj jest czysto formalnym operatorem; nie przewiduje się oceny różnicy. Jest to po prostu wygodna składnia, jak widać z tego, jak listy różnic mogą być używane do wykonania tego, co (prawdopodobnie) chcesz zrobić.

Możemy dodać element do listy różnicę następująco:

insertDL(M,X-Y,X-Z) :- Y = [M|Z]. 

Tutaj M jest nowy element chcemy dodać, XY jest „stary” lista różnica, i XZ jest „nowy” różnicę (do której dodano M, przez ujednolicenie poprzednio wolnej zmiennej Y z listą częściową [M | Z], tak, że Z staje się "otwartym" ogonem częściowej listy X).

Kiedy w końcu wprowadzimy rzeczy do naszej listy różnic, możemy zamienić X na właściwą listę, ustawiając "wolny ogon" w tym miejscu na pustą listę []. W tym sensie X jest zmienną "taką samą", jak w momencie, gdy po raz pierwszy zaczęliśmy, po prostu zunifikowane przez kolejne kroki od zmiennej wolnej do właściwej listy.

Jest to bardzo potężna technika programowania w Prologu, a jej wygodne korzystanie z niej wymaga pewnej praktyki. Niektóre linki do dalszej dyskusji na stronie:

[Z listy Prolog do różnicy list]
http://www.irisa.fr/prive/ridoux/ICLP91/node8.html

[list różnica Implementacja w Prologu]
http://www.cl.cam.ac.uk/~jpw48/difflists.pdf

[Lecture Notes: Listy Różnica]
http://www.cs.cmu.edu/~fp/courses/lp/lectures/11-diff.pdf

1

Niektóre prology udostępniają predykat setarg/3 w celu modyfikacji warunków w miejsce.

W celu wykorzystania go na listę, trzeba tylko wziąć pod uwagę, że są one po prostu ładny reprezentacja łańcuchów względem związek z funktora '.'/2

w każdym przypadku, gdy trzeba użyć setarg/3 w Prologu, to prawdopodobnie oznacza, że ​​robisz coś złego.

Powiązane problemy