;; rules to handle PPs after verbs like "give"

(add-rule-sem '(v+args ==> v3+tns np pp+dat)
	      '(lambda (v3+tns np pp+dat)
		 `(lambda (subj)
		    (funcall ,v3+tns subj (funcall ,pp+dat) ',np))))

(add-rule-sem '(vbar-tns ==> v3-tns np pp+dat)
	      '(lambda (v3-tns np pp+dat)
		 `(lambda (subj)
		    (funcall ,v3-tns subj (funcall ,pp+dat) ',np))))

(add-rule-sem '(pp+dat ==> p+dat np)
	      '(lambda (p+dat np)
		 (funcall p+dat np)))

(add-rule-sem '(vbar-tns ==> v3-tns np np)
	      '(lambda (v3-tns np1 np2)
		 `(lambda (subj)
		    (funcall ,v3-tns subj ',np1 ',np2))))

;; rules for passive sentences

(add-rule-sem '(vp ==> aux%be+tns v+passp)
	      '(lambda (aux%be+tns v+passp)
		 `(lambda (subj)
		    (funcall ,v+passp subj))))

(add-rule-sem '(v+passp ==> v2+passp)
	      '(lambda (v2+passp)
		 `(lambda (patient)
		    (funcall ,v2+passp patient 'somebody))))

(add-rule-sem '(v+passp ==> v2+passp pp+agby)
	      '(lambda (v2+passp pp+agby)
		 `(lambda (patient)
		    (funcall ,v2+passp patient (funcall ,pp+agby)))))

(add-rule-sem '(pp+agby ==> p+agby np)
	      '(lambda (p+agby np)
		 (funcall p+agby np)))

;; rules for WHO questions

(add-rule-sem '(q+wh ==> np+wh vp)
	      '(lambda (np+wh vp)
		 (wh-question np+wh (funcall vp `,np+wh))))

(add-rule-sem '(q+wh ==> np+wh q/np)
	      '(lambda (np+wh q/np)
		 (wh-question np+wh (funcall q/np `,np+wh))))

(add-rule-sem '(q/np ==> aux%do%modal np vbar-tns/np)
	      '(lambda (aux%do%modal np vbar-tns/np)
		 `(lambda (who)
		    (funcall ,aux%do%modal
			     (funcall ,vbar-tns/np ',np who)))))

(add-rule-sem '(vbar-tns/np ==> v2-tns np/np)
	      '(lambda (v2-tns np/np)
		 `(lambda (agent patient)
		    (funcall ,v2-tns agent patient))))

(add-rule-sem '(vbar-tns/np ==> v3-tns np pp+dat/np)
	      '(lambda (v3-tns np pp+dat/np)
		 `(lambda (agent who)
		    (funcall ,v3-tns agent who ',np))))

(add-rule-sem '(pp+dat/np ==> p+dat np/np)
	      '(lambda (p+dat np/np) np/np))

(add-rule-sem '(vbar-tns/np ==> v3-tns np/np pp+dat)
	      '(lambda (v3-tns np/np pp+dat)
		 `(lambda (agent who)
		    (funcall ,v3-tns agent (funcall ,pp+dat) who))))

(add-rule-sem '(vbar-tns/np ==> v2-tns np/np)
	      '(lambda (v2-tns np/np)
		 `(lambda (agent who)
		    (funcall ,v2-tns agent who))))
		   
;; rules for before/after

(add-rule-sem '(pp ==> p+time s)
	      '(lambda (p+time s)
		 (funcall p+time s)))

(add-rule-sem '(vbar-tns ==> v2-tns np pp)
	      '(lambda (v2-tns np pp)
		 `(lambda (subj)
		    (funcall ,pp (funcall ,v2-tns subj ',np)))))

