Prolog分组控制

时间:2017-10-14 14:43:17

标签: database prolog logic

我正在尝试使用Prolog来解决问题。

我得到了一个事实列表book/2,代表book(title,author)

...
book('Kamizelka', 'Boleslaw Prus').
book('Katarynka', 'Boleslaw Prus').
book('Kazania sejmowe', 'Piotr Skarga').
book('Konrad Wallenrod', 'Adam Mickiewicz').
...

我的问题是:有没有办法输入一个查询来列出所有按作者分组的标题?我的意思是,没有输入多种方式的书(任何,'author1')。书(任何, 'author2')。

1 个答案:

答案 0 :(得分:0)

是的,您可以使用setof/3谓词:

group_author(Author,Books) :-
    setof(Book,book(Book,Author),Books).

如果我们查询它,我们获得:

?- group_author(Author,Books).
Author = 'Adam Mickiewicz',
Books = ['Konrad Wallenrod'] ;
Author = 'Boleslaw Prus',
Books = ['Kamizelka', 'Katarynka'] ;
Author = 'Piotr Skarga',
Books = ['Kazania sejmowe'].

setof/3有三个参数:

  1. 收益率,我们感兴趣的结果(此处Book);
  2. 目标,Prolog应该追求的目标,(这里book(Book,Author));和
  3. 集合,结果集合,包含没有重复项的结果的列表(此处为Books)。