Tôi đang trong tình huống sau: Tôi có một danh sách và tôi sẽ chỉ xóa nó khỏi phần tử cuối cùng.Làm thế nào để xóa phần tử cuối cùng khỏi danh sách trong Prolog?
Tôi có thực hiện các nguyên tắc sau (mà không làm việc tốt):
deleteLastElement([Only],WithoutLast) :-
!,
delete([Only],Only,WithoutLast).
deleteLastElement([_|Tail],WithoutLast) :-
!,
deleteLastElement(Tail,WithoutLast).
Vấn đề là khi tôi gọi nó, tất cả các phần tử trong danh sách được xóa, trên thực tế nếu tôi thực hiện sau tuyên bố tôi có được:
[debug] ?- deleteLastElement([a,b,c], List).
List = [].
Nhìn vào dấu vết tôi nghĩ rằng đó là rõ ràng nguyên nhân của vấn đề này:
[trace] ?- deleteLastElement([a,b], List).
Call: (7) deleteLastElement([a, b], _G396) ? creep
Call: (8) deleteLastElement([b], _G396) ? creep
Call: (9) lists:delete([b], b, _G396) ? creep
Exit: (9) lists:delete([b], b, []) ? creep
Exit: (8) deleteLastElement([b], []) ? creep
Exit: (7) deleteLastElement([a, b], []) ? creep
List = [].
Khi trường hợp cơ sở được đạt tới, danh sách WithoutLast được thống nhất với danh sách trống [] và khi quay lui được thực hiện các WithoutLast vẫn giữ nguyên danh sách trống.
Điều này không tốt.
Tôi đã suy nghĩ để thực hiện nó làm các hoạt động sau:
- Đếm số phần tử trong danh sách trước khi gọi các vị đó xóa các yếu tố cuối cùng.
- Lặp bằng đệ quy và giảm các giá trị của các số nguyên tố mỗi lần
- Nếu đó là sự thật rằng số lượng phần tử là 0 có nghĩa rằng đây là yếu tố cuối cùng vì vậy tôi xóa nó khỏi danh sách ban đầu
Nhưng điều này dường như với tôi không rõ ràng và không tốt như vậy, tôi sẽ biết nếu có một giải pháp tốt tuyên bố cho vấn đề này.
+1 cho 'append (WithoutLast, [_], List)' trick. –