This is interesting…
1. If you allow multiple * in the value=”...” the contains becomes un-necessary, as per Steve’s example above. I never knew standard AIML allowed multiple * in the value, though.
2. Using get with an undefined property returns an empty string or “unknown” (the documentation seems unclear on that point). Also its not clear what name=“myprop” should return if property “myprop” is undefined. In Uberbot I settled on both these returning an empty string.
3. Again I have never seen AIML with <if> in it. And I don’t think it’s needed as it’s covered by the first version of <condition>. In fact I would argue against <if>, and the exists and contains attributes on the grounds of non-use, and on the grounds they can be coded in other ways.
4. I think there is actually a version 1.01 of the AIML spec which may serve better than the v 1.0 you currently found. It’s more up to date and doesn’t have some of the obscure elements and attributes that were never used.
Finally this (to my mind) shows a big need for AIML standardization for AIML v2, along the lines of the excellent spec that was produced for v1.01.