1

我有一个问题,需要有人纠正我:

store(wyoming, [evan, sandra], [storybook, fiction, general]).
store(brooklyn, [haas, maria], [fiction, schoolbook, religion]).
store(oakland, [rich, walker, dina, vince], [storybook, schoolbook, fiction]).

如果我咨询?-locations(storybook).答案必须返回真,因为故事书在不止一家商店有售。我这样写我的谓词:

locations(Book) :- store(_, [_], [Books]), member(Book, Books).

当我咨询时,无论我输入什么类型的书,我都会返回false。如何解决这个问题?

4

1 回答 1

0

应用 mbratch 建议后,您仍然需要检查 a 何时Book在多个商店可用。简单的方法,效率低下,因为如果“分析”所有数据库:

locations(Book) :-
   findall(Book, (store(_,_,Books), memberchk(Book, Books)), L),
   length(L, N), N > 1.

我们可以让它不那么冗长:

locations(Book) :-
   findall(_, (store(_,_,Books), memberchk(Book, Books)), [_,_|_]).

注意我使用 memberchk/2 而不是 member/2。它更快,并且作为副作用,避免在只有商店匹配但书籍不止一次出现的情况下回答 true。

为避免扫描整个数据库,连接将执行以下操作:

locations(Book) :-
   store(X,_,BooksX), memberchk(Book,BooksX),
   store(Y,_,BooksY), Y \= X, memberchk(Book,BooksY),
   !.

最后的削减可以防止多个无用的答案相同Book

于 2013-09-27T05:44:27.013 回答