operator: inverse

    description:
        inverse[op] sp
        reverses the direction of a literal operator, even |*> rules
        eg, say we have: op |A> => |B>
        then: inverse[op] |B> returns |A>
        and it really is an inverse, since:
        op inverse[op] |B> returns |B>
        and:
        inverse[op] op |A> returns |A>
        (though there are cases where it is not an exact inverse)
        
        NB: potentially quite slow, especially for |*> rules
        
    examples:
        load family.sw
        load family-relations.sw
        
        -- find who is an uncle in this data-set:
        such-that[is-an-uncle] rel-kets[*]
            |peter>
        
        -- find who Peter is an uncle for:
        inverse[uncle] |peter>
            |sally> + |erica>
            
        -- find who Peter is a brother-in-law for:
        inverse[brother-in-law] |peter>
            |trude>

        -- check this result:
        brother-in-law |trude>
            |peter>

        -- find who are grand-parents:
        such-that[is-a-grand-parent] rel-kets[*]
            |sara> + |sam> + |ruth> + |mike> + |gina> + |mary> + |mark>

        -- find who they are grand-parents for:
        inverse[grand-parent] |sara>
            |sally> + |erica>
        
        inverse[grand-parent] |sam>
            |sally> + |erica>
        
        inverse[grand-parent] |gina>
            |peter> + |tom>

        inverse[grand-parent] |mark>
            |peter> + |tom>

    see also:
        find-inverse

Home