:- op(500, yfx, @).
:- op(550, xfx, =>).
:- op(600, xfy, ^).

s(S) --> sn(V^S), v(i, V).

sn(SN) --> det(N^SN), n(c, N).
sn(P^P@N) --> n(p, N).

det(P^Q^qualquer(X, P@X => Q@X)) --> [todo].

n(c, m) --> [menino].
n(p, p) --> [pedro].

v(i, d) --> [dormiu].
