Tôi đang cố xóa các mục nhập trùng lặp khỏi danh sách trong phần mở đầu. Vì vậy, một danh sách [a, b, a, c, b, a] sẽ trả về [a, b, c]. Tôi không thể sử dụng bất kỳ chức năng tích hợp nào. Tôi đã tìm kiếm ở đây và tìm thấy mã này.Prolog: Loại bỏ các bản sao
member(X,[X|_]) :- !.
member(X,[_|T]) :- member(X,T).
set([],[]).
set([H|T],[H|Out]) :- not(member(H,T)), set(T,Out).
set([H|T],Out) :- member(H,T), set(T,Out).
Nhưng điều đó sẽ đưa danh sách của tôi và trở về [c, b, a] không [a, b, c]
Tôi có loại bỏ mã mà sẽ mất một yếu tố và một danh sách và trả về một danh sách với sự xuất hiện của phần tử đó trong danh sách bị xóa. Vì vậy, tôi đã cố gắng để kết hợp đó vào phương pháp loại bỏ trùng lặp của tôi, nhưng tôi không thực sự hiểu prolog rất tốt vì vậy nó không hoạt động. Về mặt logic, tôi muốn lấy một danh sách phản đối đầu bằng cuộc gọi đệ quy trên danh sách mới trừ đi tất cả các lần xuất hiện của đầu. Đây là những gì mã sẽ giống như trong sml.
fun remv(_,nil) = nil
| remv(a,x::xs) = if x=a then remv(a,xs) else x::remv(a,xs);
fun remvdub (nil) = nil
| remvdub(x::xs) = x::remvdub(remv(x,xs));
Vì vậy, đây là những gì tôi đã cố gắng trong prolog
remv(_,[],[]).
remv(X,[X|T],Ans) :- remv(X,T,Ans).
remv(X,[H|T],[H|K]) :- remv(X,T,K).
remvdub([],[]).
remvdub([H|T],[H|Ans]) :- remvdub(Ans1,Ans), remv(H,T,Ans1).
tôi đang thiếu gì?
Cảm ơn SQB chính xác là logic của những gì tôi đang cố gắng làm. Ngay cả khi xem xét mã của bạn, tôi dường như không thể tìm ra nơi tôi đã phạm sai lầm, họ cũng đọc như vậy với tôi. Tuy nhiên, bạn làm việc và tôi bị mắc kẹt trong một vòng infinte. – user3043403
hmm tôi nghĩ rằng tôi đã tìm ra, thứ tự bên trong: - quan trọng vì vậy dòng của tôi. remvdub ([H | T], [H | Ans]): - remvdub (Ans1, Ans), remv (H, T, Ans1). Nên là remvdub ([H | T], [H | Ans]): - remv (H, T, Ans1), remvdub (Ans1, Ans). – user3043403