The basic idea (as I understand it) is that kind hierarchies are set at compile time. This includes the properties and component that objects have. Like this (haven’t tested it so I’m not positive that the syntax is right):
[code]A robot is a kind of person.
A generator is a kind of thing. A generator is part of every robot.
A robot can be android or mechanoid (this is its form property). A robot is usually mechanoid.
A robot has a number called size. The size of a robot is usually 5.[/code]
This sets up two kinds, “robot” and “generator,” and makes sure that every robot that you go on to create in your source code* will have a generator created as part of it. It also gives every robot two properties that can be set during runtime, the form (which has two values that we defined ourselves) and size (which is a number, which is a pre-defined kind so we don’t have to say anything more about what the size can be). The “usually” lines give us the default values for these properties – our robots will have these values unless we specify otherwise.
Now we can set the initial values of properties when we define things in our source code:
Pinbot is a mechanoid robot. The size of Pinbot is 7.
We didn’t really need to say “mechanoid,” since we set “mechanoid” as the default, but I said it anyway.
These values can be changed in the course of play:
Instead of kissing Pinbot:
say "Pinbot says 'I live!'";
now Pinbot is android.
(Somewhat disturbed that my subconscious dredged that up.)
Which means that we cannot say things like “A face is part of every android robot.” “Android” isn’t part of the kind hierarchy that’s set at compile time, so it can’t be used to determine things that need to be determined at compile time. If a robot got turned from mechanoid to android in the course of the game, Inform wouldn’t have any way to automatically create its face or do any of the other compile-time stuff that we might need to do as part of the transformation.
Inform doesn’t have multiple inheritance, so I think the thing you’ve described is impossible. If you want to have robots and people as separate kinds with separate kinds of bodies, I think the way to write it would be something like this:
A human is a kind of person. A human-body is a kind of thing. A human-body is part of every human.
A robot is a kind of person. A robot-body is a kind of thing. A robot-body is part of every robot.
Definition: A thing is bodily if it is a human-body or if it is a robot-body.
Then you could write rules applying to bodily things. (Again, I’m not sure I’ve got the syntax exactly right; you could look at the section of the docs on definitions. I know the docs are hard to deal with but sometimes when you know exactly what you’re looking for they can be helpful!)
Hope this has been helpful, and accurate.
*In general you can’t make new objects in the course of play; you have to define every object that’s going to be in your game in your source code. There’s an extension that lets you make objects in runtime, but I’d leave it alone for now.