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
as
location
的订单。
例如,这是一个列表示例(以这种方式打印以使其可读):

应用这种必要的谓词
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).