vocabulary Diplomacy;

/*

* Value Types
*/

CountryName is written as String; DiplomatName is written as String; LanguageName is written as String;

/*

* Entity Types
*/

Country is independent identified by its Name;

Diplomat is identified by its Name; Diplomat represents one Country (as Represented Country); Diplomat serves in one Country (as Served Country);

Language is independent identified by its Name;

LanguageUse is where

Language is spoken in Country,
Country uses Language;

Ambassador is a kind of Diplomat;

Fluency is where

Diplomat speaks at least one Language,
Language is spoken by Diplomat;

Representation is where

Ambassador is from Country (as Represented Country) to Country,
Represented Country is represented in Country by one Ambassador;

/*

* Constraints:
*/

for each Diplomat, Country at most one of these holds:

Diplomat serves in Country,
Diplomat represents Country;

Diplomat is an Ambassador that is from Country(1) to Country(2)

only if Diplomat represents Country;

Diplomat is an Ambassador that is from Country(2) to Country(1)

only if Diplomat serves in Country;

Diplomat serves in Country

only if Diplomat speaks Language that is spoken in Country;

each Ambassador occurs at least one time in

Ambassador is from Country(1) to Country(2);