Looking at Prolog documentation, predicate signatures are sometimes written as following:

```
foo(:Bar, +Baz, -Qux, ?Mop)

```

What are `:`, `+`, `-` and `?` for and how do I interpret them? Also, are these the only ones that exist or are there more of them?