1

例如:给定 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 谓词。

真的希望有人能帮助我。提前致谢!

4

1 回答 1

1

减法/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].
于 2013-09-23T09:38:52.573 回答