~(when (supporter $O) won't accept #on)
~(when (container $O) won't accept #in)
(when $O won't accept $Rel)
(if) ($Rel is one of [#under #behind]) (then)
Putting things (name $Rel) (the $O) would achieve little.
(else)
You can't put things (name $Rel) (the $O).
(endif)
So we can invent a trait for objects that accept #beside (similar to container / #in or supporter / #on) , and add its accompanying negated rule like the ones above.
Or we could just make all objects accept #beside for demo purposes.
As long as your reins are simple flag checks, you can incorporate them into the (when $ won't accept #beside) negated rule. That way you save typing prevent rules and their fail messages.
~(when $O won't accept #beside)
~(room $O)
~($O is #in #sack)
~($O is #on #spinning_disk)