例如:给定 3 个语句:
car(toyota,[sedan,5_seater,head_rest]).
car(nissan,[4_seater,sedan,2_door,head_rest,blue]).
car(peugeot,[head_rest,sedan,5_seater,sun_roof]).
items(A, X, Y)
如果 A 是包含 X 中的所有部分但不包含 Y 中的任何部分的列表汽车,如何编写一个为真的 Prolog 谓词。
真的希望有人能帮助我。提前致谢!
见减法/3
items(A, X, Y) :- subtract(X, Y, A).
如果你保持你的列表排序(即像集合),ord_subtract /3 是一个更好的选择
编辑:对不起无用的答案,这是修改后的答案。相关的列表处理谓词是intersection /3,而setof /3 是一个强大的列表“构造器”。
items/3 可以这样写
items(A, Present, Miss) :-
setof(Car, Parts^(car(Car, Parts),
intersection(Parts, Present, Present),
intersection(Parts, Miss, [])), A).
因为你的数据库有点少,为了测试我输入
?- items(L,[sedan],[blue]).
L = [peugeot, toyota].