首页 > 解决方案 > Prolog 从列表中删除元素

问题描述

我有以下事实来删除列表中元素的所有出现。虽然输出是正确的,但元素只是被替换为一个空格

remover( _, [], []).
remover( R, [R|T], [T2]) :- remover( R, T, T2).
remover( R, [H|T], [H|T2]) :- H \= R, remover( R, T, T2).

当我调用 remover 时,输出是:

remover(3,[1,2,3,4,3],Res)
Res = [1, 2, [4, []]]

我也有以下事实仅删除第一次出现但输出与上面相同

remover_primeira( _, [], []).
remover_primeira( R, [R|T], [T2]) :-remover_primeira( R, T, T2),!.
remover_primeira( R, [H|T], [H|T2]) :- H \= R, remover_primeira( R, T, T2).

我究竟做错了什么?

标签: listprolog

解决方案


您不应该T2在第二个子句中包含一个单例列表,它应该是:

remover( _, [], []).
remover( R, [R|T], T2) :- remover( R, T, T2).
remover( R, [H|T], [H|T2]) :- H \= R, remover( R, T, T2).

如果您只需要删除第一次出现,那么您不应该从找到该元素的那一刻起递归:

remover( _, [], []).
remover( R, [R|T], T).
remover( R, [H|T], [H|T2]) :- H \= R, remover( R, T, T2).

推荐阅读