Самая базовая c версия вашего кода, которую я могу придумать, такова:
book("Book 1", "Author 1", 2012, "Company 1").
book("Book 2", "Author 1", 2012, "Company 1").
book("Book 3", "Author 2", 2014, "Company 1").
book("Book 4", "Author 3", 2015, "Company 2").
book("Book 5", "Author 4", 2016, "Company 3").
findBookByCompany(Company,Name) :- book(Name,_,_,Company).
findBookByAuthor(Author,Name) :- book(Name,Author,_,_).
findBookByYear(Year,Name) :- book(Name,_,Year,_).
?-findBookByAuthor("Author 1",Name),write(Name),nl,fail.
Пролог - это изложение фактов и правил, а затем проверка гипотезы.
Вы не строите список книг, вы просто излагаете факты о книгах.
Если затем вы хотите узнать, есть ли книга от определенного автора, вы создаете правило. Чтобы findBookByAuthor(Author,Name)
был успешным, book(Name,Author,_,_)
должен быть успешным, и вы go оттуда.
Моя вышеприведенная программа выводит следующее:
Book 1
Book 2
No.
Она выводит No.
, потому что я В частности, он сказал, что не удалось, и вернитесь назад, чтобы получить все ответы, но откат будет продолжаться до тех пор, пока он не сможет найти больше ответов, а затем сообщит об ошибке.
Если вы хотите написать это более подробно процедурным путем, тогда вы можете сделать это:
?-
append([], [book("Book 1", "Author 1", 2012, "Company 1")], X1s),
append(X1s, [book("Book 2", "Author 1", 2012, "Company 1")], X2s),
append(X2s, [book("Book 3", "Author 2", 2014, "Company 1")], X3s),
append(X3s, [book("Book 4", "Author 3", 2015, "Company 2")], X4s),
append(X4s, [book("Book 5", "Author 4", 2016, "Company 3")], X5s),
member(book(Name,"Author 1",_,_),X5s),
write(Name),
nl,
fail.
Это не хороший Пролог, хотя. Вам следует избегать этого.