从列表列表中删除项目

时间:2015-04-26 22:35:37

标签: prolog

我有一个列表,其中包含具有ID,名称和性别的记录。我试图让用户传递Id(整数)或名称(字符串),并删除该记录,但它没有做任何事情。

这就是我所拥有的:

choice(5,X) :-
    write('\tEnter an ID or Name:'),
    read(Item),
    rem(Item, X, X2),
    menu(X2).

我的删除是:

rem(Item, [], []) :- write("List is empty.").
rem(Item, [[Item,RT]|L],L).
rem(Item, [[ID, Item|PT]|L]|L).
rem(Item, [X|XT],[X|YT]) :- rem(Item, XT, YT).

但是当我运行它时,它只给了我一个整数列表。 任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

可能是我误解了这个问题,但我认为

rem(Item, L_In, L_Out) :-
    select([Item|_], L_In,L_Out);select([_,Item|_], L_In, L_Out).

完成这项工作。

答案 1 :(得分:0)

您的代码(几乎)正常工作。

你在第三条规则中输入了一个拼写错误:你写了一个|而不是,,prolog解释器让你知道:

Warning: user://1:18:
    Clauses of (rem)/3 are not together in the source-file

您可能希望删除写入("列表为空。"),因为该规则不仅仅在您尝试从空列表中删除项目时匹配,但它也是基本情况递归删除。它打印数字是因为你提供了一个字符串(" abc")而不是一个原子(' abc')。将write('abc')的结果与write("abc")的结果进行比较。

此外,您需要删除规则,因为如果该项目存在于列表中,您希望将其删除,并且您对该选择点的回溯所产生的其他解决方案不感兴趣。

rem(Item, [], []).
rem(Item, [[Item,RT]|L],L) :- !.
rem(Item, [[ID, Item|PT]|L],L) :- !.
rem(Item, [X|XT],[X|YT]) :- rem(Item, XT, YT).

测试:

?- rem(x, [[a,3],[b,4],[remove_me,x,6],[d,8]], X).
X = [[a, 3], [b, 4], [d, 8]].