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ą
Odpowiedz
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.
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
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.
- 1. OCaml wstaw element do listy
- 2. Wstaw tę samą ustaloną wartość do wielu wierszy.
- 3. Zamówienie LINQ. Czy zawsze zwraca tę samą uporządkowaną listę?
- 4. Scala wstaw do listy w określonych lokalizacjach
- 5. Użycie Pobierz i zwróć listę błędów
- 6. Wykonaj polecenie Wstaw i zwróć wstawiony identyfikator w Sql
- 7. Node.js + MongoDB: wstaw jedną i zwróć nowo wstawiony dokument
- 8. Zatrzymaj strumień Twitter i zwróć listę statusu za pomocą twitter4j
- 9. Znajdź zgodny predykat i użyj iterable.tryFind zwróć element z listy w java
- 10. Stosując tę samą akcję dla wielu duszków?
- 11. Python - implementuj __iter__ lub zwróć listę __iter__
- 12. Jak wymusić, aby elementy listy zagnieżdżonej miały taką samą szerokość jak element listy nadrzędnej?
- 13. System.Random nadal zwraca tę samą wartość
- 14. Zwróć pierwszy element w tablicy_agg()
- 15. Policz tę samą wartość w tablicy
- 16. Gitlab Wiki tę samą stronę linki
- 17. Zachowaj tę samą zmienną dummy w danych treningowych i testowych
- 18. Jak wymienić tę samą postać kilka razy?
- 19. Klasy i nazw dzielą tę samą nazwę w C++
- 20. Jak udostępnić tę samą zmienną między modułami?
- 21. Android - Wyświetl listę usuń element i Odśwież
- 22. dodaj element do tablicy ruby Zwróć nową tablicę
- 23. Zaktualizuj tę samą tabelę w SQL Server
- 24. Dlaczego * curr i curr-> val mają tę samą wartość?
- 25. Jak ustawić tę samą szerokość i wysokość przycisku?
- 26. CSS: podaj tę samą szerokość wejściom tekstu i hasła
- 27. Czy enable_shared_from_this i make_shared zapewniają tę samą optymalizację
- 28. Jak zrobić tę samą szerokość wskaźnika Tablayout i tekstu
- 29. Dlaczego otrzymuję tę samą wartość przesunięcia i pozycji w jQuery?
- 30. Czy mogę wielokrotnie dodać tę samą funkcję DataRow do DataTable?
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