## Outline
- Abstract Algebraic Data types
- Elementary types
	- List
	- Stack
	- Queue
	- Set
- Searching algorithms
- Tree
	- Binary
	- General
	- BST
	- AVL
	- A234

## Abstract Algebraic Data Types
### Signature and hierarchy
- a signature is composed by 
	- a type (integer, stack, queue, graph)  
	- an operations (name: profile)
	- Exemple: 
		- ``insert: list x integer x element -> list``
		- ``insert(l, i, e)``
		- return a result of type `list`
	- We can use the `_`to pass an argument without parentheses
		- `facotrial: interger -> integer`= `_!: interger -> integer`
		- `power: integer x integer -> integer`= `_^_: integer x integer -> integer`
		- Operations
			- `0: -> integer`
			- `false: -> boolean`
			- `pi: -> real`
		- Types
			- Boolean
				- Opération:
					- `false: -> boolean`
					- `true: -> boolean`
					- `not_: boolean -> boolean`
					- `_and_: boolean x boolean -> boolean`
					- `_or_: boolean x boolean -> boolean`
			- Vectors (defined type)
				- Uses: integer and element (predefined types)
				- Operations:
					- `modify: vector x integer x element -> vector` (internal operation)
					- `nth: vector x integer -> element` (observers)
					- `lowerlimit: vector -> integer` (observers)
					- `upperlimit: vector -> integer` (observers)
				- Use
					- `nth(v, i+2)`
> Every time that an operation return a defined type, is a **internal operation.** An internal operation will really modify the data

> **An observer** is when there is AT LEAST 1 defined type vector and who return a predefined type. The observer just look into the data and return the selected value, but he don't change any values. 

