我有一个列表,其中包含具有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).
但是当我运行它时,它只给了我一个整数列表。 任何帮助将不胜感激!
答案 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]].