Layering Clothing

Hmm… I would avoid this. You are adding a negated rule, in order to prevent a query such as (#shirt is in scope) from succeeding. But it’s conceivable that the library or the story would query *($Obj is in scope) with an unbound parameter, in order to backtrack over every object in scope. In that case, if the negated rule were to succeed, it would also stop the backtracking.

I think it would be better to override the original ($ is in scope) rule entirely, e.g. with (just).

Just a quick tip here: When you collect a bunch of values only to check if the resulting list is empty, then what you’re essentially doing is checking whether one such value exists. You can do that without collecting:

        *($C is #wornby $Someone)
        (viewing $Obj is prevented by $C)
        ~($Obj = $C)
3 Likes