2015-12-12 3 views
0

Une personne peut posséder plusieurs voitures mais une voiture appartient à une seule personne. Dans clipsPyClips: Créer des références multislot/multifield à d'autres instances de clips

(defclass PERSON 
    (is-a USER) 
    (role concrete) 
    (pattern-match reactive) 
    (multislot cars) ; each list element should be a reference to an instance of type CAR 
) 

(defclass CAR 
    (is-a USER) 
    (role concrete) 
    (pattern-match reactive) 
    (slot owner) ; should be a reference to an instance of type PERSON 
) 

J'utilise pyclips. Maintenant, je voudrais lier une instance existante de CAR à une instance PERSON existante. Mon essai:

clips_person_instance = clips.FindInstance(name_of_existing_person) 
clips_car_instance = clips.FindInstance(name_of_existing_car) 

list_of_cars = clips_person_instance.Slots["cars"] 
list_of_cars.append(clips_car_instance) 
clips_person_instance.Slots["cars"] = list_of_cars 

Cela me donne

TypeError: list element of type <class 'clips._clips_wrap.Instance'> cannot be converted

Pour autant que je peux le voir est un problème pyclips faire ajouter une liste d'instances à une fente. S'il est juste une seule instance (pas de liste), cela fonctionne très bien:

clips_car_instance.Slots["owner"] = clips_person_instance 

Ma question: Comment puis-je "lien" pour les instances de classe dans les clips (py)? En OO-mots: Comment créer une association entre deux objets? Comment créer une relation "1 à plusieurs" dans des clips (py)?

Répondre

1

Il semblerait que les adresses de faits et d'instances ne soient pas entièrement prises en charge dans le code python dans la même mesure que les autres types de données de primitives CLIPS. Je suggère de stocker le nom de l'instance plutôt que l'adresse de l'instance dans la valeur multifield (dans ce cas, utilisez clips_car_instance.Name plutôt que clips_car_instance). Vous devrez utiliser FindInstance pour convertir le nom de l'instance en une adresse d'instance pour manipuler l'instance.

>>> import clips 
>>> clips.Load("classes.clp") 
>>> clips.Eval("(make-instance Fred of PERSON)") 
<InstanceName 'Fred'> 
>>> clips.Eval("(make-instance Toyota of CAR)") 
<InstanceName 'Toyota'> 
>>> name_of_existing_person = "Fred" 
>>> name_of_existing_car = "Toyota" 
>>> clips_person_instance = clips.FindInstance(name_of_existing_person) 
>>> clips_car_instance = clips.FindInstance(name_of_existing_car) 
>>> list_of_cars = clips_person_instance.Slots["cars"] 
>>> list_of_cars.append(clips_car_instance.Name) 
>>> clips_person_instance.Slots["cars"] = list_of_cars 
>>> clips_person_instance.Slots["cars"] 
<Multifield [<InstanceName 'Toyota'>]> 
>>>