abstract Book// a template for a book
title -> string// a title can hold a text value
subtitle -> string ?// subtitle is optional
year -> integer// year has a numeric value
page 2..* // at least 2 pages
xor format// a book can be in only one format at a time
paper
hardcover ?// hardcover is optional and only makes sense when the book is paper
electronic
xor kind// a book can be of one kind at a time
textbook
manual
reference
fiction
nonfiction
other -> string// other allows giving a kind in text
author -> Author +// author points at least one author of the book
[ year >= 1970 => ISBN ]
ISBN -> string ?// it is currently not possible to specify in Clafer that ISBN has 10 digits
GS1 -> string ?
[ year >= 2007 => GS1 ]
abstract Person
name -> string// a template for a person
dob -> string ?
abstract Author : Person// of course the person always has dob but for our application it is possible not to give it
book -> Book +
GenerativeProgramming : Book// author is a special person who has at least one book
[ title = "Generative Programming" ]// book has to point at least one concrete book
[ year = 2000 ]
[ # page = 589 ]// a concrete example of a book
[ paper ]
[ nonfiction ]
[ author = Czarnecki, Eisenecker ]// number (#) of instances of page is 589
[ ISBN = "0201309775" ]// because the book is paper it automatically also has a format
Czarnecki : Author// because the book is nonfiction it automatically also has a kind
[ name = "Krzysztof Czarnecki" ]// Czarnecki and Eisenecker are the authors
[ GenerativeProgramming in book ]// there's no GS1 prefix, which is ok because the year is < 2007
Eisenecker : Author
[ name = "Urlich Eisenecker" ]
[ GenerativeProgramming in book ]
// GenerativeProgramming is one of Czarnecki's books