16 Outubro 2023 - #MFES 

## Alloy4Fun

```c
sig User {
	follows : set User,
	sees : set Photo,
	posts : set Photo,
	suggested : set User
}

sig Influencer extends User {}

sig Photo {
	date : one Day
}
sig Ad extends Photo {}

sig Day {}
// Specify the following properties.
// You can check their correctness with the different commands and
// when specifying each property you can assume all the previous ones to be true.

pred inv1 {
	// Every image is posted by one user.
	all y: Photo | some x: User | x->y in posts
	all x,y : User, z: Photo | x->z in posts and y->z in posts implies x=y
	
	// or (equivalent to 2nd formula)
	all x,y : User, z: Photo | x in posts.z and y in posts.z implies x=y
	
	// or (equivalent to 1st and 2nd formula)
	all y: Photo | some posts.y
	all y: Photo | lone posts.y
	
	// or (equivalent to 1st and 2nd formula)
	all y:Photo | one posts.y
}
 

pred inv2 {
	// Users cannot follow themselves.
	all x: User | x->x not in follows
	
	//or
	all x: User | x not in x.follows
}


pred inv3 {
	// Users can see ads posted by everyone, 
	// but only see non ads posted by followed users.
	all x : User, y :Photo | x->y in sees implies (y in Ad) or 
	(all z:User | z->y in posts implies x->z in follows)
	
	//or
	all x :User, y :Photo | x in sees.y implies (y in Ad) or 
	(all z:User | z in posts.y implies z in x.follows)
	
	//or
	all x :User, y :Photo | x in sees.y implies (y in Ad) or
	(posts.y in x.follows)
	
	//or
	all x :User, y :Photo | x in sees.y implies (y in Ad) or
	(y in x.follows.posts)
	
	//or
	all x :User, y :Photo | x in sees.y implies y in x.follows.posts + Ad
	
	//or
	all x :User, y :Photo | y in x.sees implies y in x.follows.posts + Ad
	
	//or
	all x :User | x.sees in x.follows.posts + Ad
}


pred inv4 {
	// If a user posts an ad then all its posts should be labeled as ads. 

}


pred inv5 {
	// Influencers are followed by everyone else.
	all x: Influencer | follows.x = User-x
}


pred inv6 {
	// Influencers post every day.
	all x: Influencer, y : Day | x.posts.date = y
}


pred inv7 {
	// Suggested are other users followed by followed users, but not yet followed.
	
}


pred inv8 {
	// A user only sees ads from followed or suggested users.

}
```