Prolog 删除列表中出现的所有术语
我知道这听起来“重复”,但请帮助我 我对三个术语的定义如下:Prolog 删除列表中出现的所有术语,prolog,Prolog,我知道这听起来“重复”,但请帮助我 我对三个术语的定义如下: type([a, b, c, d]:location). type([coffee, tea, lemonade, water, biscuits]: object). type([order(object, location)]: order). 我有一段代码,然后生成一个随机顺序列表 我现在需要一个谓词来删除所有与order(X,a)统一的术语,也就是说,从该列表中删除所有具有aaslocation的订单。 例如,这是一
type([a, b, c, d]:location).
type([coffee, tea, lemonade, water, biscuits]: object).
type([order(object, location)]: order).
我有一段代码,然后生成一个随机顺序列表
我现在需要一个谓词来删除所有与order(X,a)
统一的术语,也就是说,从该列表中删除所有具有a
aslocation
的订单。例如,这是一个列表示例(以这种方式打印以使其可读): 应用这种必要的谓词
my_delete(List、[order(u,a)、order(u,b)],Result)
将给出:
order(water,c)
order(lemonade,d)
order(water,c)
order(tea,c)
order(coffee,d)
order(water,d)
到目前为止,我试图从主列表中删除一个子列表,但它所做的只是删除
a
的单个元素和b
的单个元素,而不是全部。这是此类谓词的代码(也要感谢这一点):
我尝试了一个问题,但没有如预期的那样奏效,那就是:
remove_list(Input_list, [ordine(_, a), ordine(_, b)], Result).
请注意,我需要重复的,因此使用集合将不起作用。您可以使用否定
\+
来避免过滤器列表的递归进一步统一:
remove_list([], _, []).
remove_list([X|Tail], ToDelete, Result):-
(\+( memberchk(X, ToDelete) ) ->
Result=[X|NResult] ;
Result=NResult
),
remove_list(Tail, ToDelete, NResult).
使用带有谓词、输入列表和输出列表的
exclude/3
:
rev_memberchk(List, Member) :-
memberchk(Member, List).
my_delete(Input_List, Orders, Result) :-
exclude(rev_memberchk(Orders), Input_List, Result).
使用memberchk/1
而不是member/2
提高效率;您不需要绑定输出,只需要知道它是否可以统一。如果您也有lambda表达式,则可以通过消除使用重新排序的参数编写谓词的需要,将其转换为一行:
my_delete(Input_List, Orders, Result) :-
exclude({Orders}/[X]>>memberchk(X, Orders), Input_List, Result).
您的Prolog方言是否有
exclude/3
谓词?是的!我该如何使用它?不得不说,我从未见过这样的否定,箭头“->”。箭头真的很奇怪:但否定很重要:另请参见:
rev_memberchk(List, Member) :-
memberchk(Member, List).
my_delete(Input_List, Orders, Result) :-
exclude(rev_memberchk(Orders), Input_List, Result).
my_delete(Input_List, Orders, Result) :-
exclude({Orders}/[X]>>memberchk(X, Orders), Input_List, Result).