PyClips:创建包含对其他剪辑实例的引用的多槽/多场
PyClips: Create multislot / multifield containing references to other clips instances
一个人可以拥有几辆车,但一辆车只能由一个人拥有。
在剪辑中
(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
)
我正在使用 pyclips。
现在我想 link 现有的 CAR 实例到现有的 PERSON 实例。我的尝试:
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
这给了我
TypeError: list element of type <class 'clips._clips_wrap.Instance'>
cannot be converted
据我所知,让 pyclips 将实例列表添加到插槽是一个问题。如果它只是一个实例(没有列表),这很好用:
clips_car_instance.Slots["owner"] = clips_person_instance
我的问题: 我如何 "link" 到 class (py)clips 中的实例?用 OO 的话来说:如何在两个对象之间创建关联?如何在 (py)clips 中创建“一对多”关系?
看起来事实和实例地址在 python 代码中没有得到与其他 CLIPS 原始数据类型相同程度的完全支持。我建议在多字段值中存储实例名称而不是实例地址(在这种情况下,使用 clips_car_instance.Name 而不是 clips_car_instance)。您必须使用 FindInstance 将实例名称转换回实例地址才能操作实例。
>>> 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'>]>
>>>
一个人可以拥有几辆车,但一辆车只能由一个人拥有。 在剪辑中
(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
)
我正在使用 pyclips。 现在我想 link 现有的 CAR 实例到现有的 PERSON 实例。我的尝试:
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
这给了我
TypeError: list element of type
<class 'clips._clips_wrap.Instance'>
cannot be converted
据我所知,让 pyclips 将实例列表添加到插槽是一个问题。如果它只是一个实例(没有列表),这很好用:
clips_car_instance.Slots["owner"] = clips_person_instance
我的问题: 我如何 "link" 到 class (py)clips 中的实例?用 OO 的话来说:如何在两个对象之间创建关联?如何在 (py)clips 中创建“一对多”关系?
看起来事实和实例地址在 python 代码中没有得到与其他 CLIPS 原始数据类型相同程度的完全支持。我建议在多字段值中存储实例名称而不是实例地址(在这种情况下,使用 clips_car_instance.Name 而不是 clips_car_instance)。您必须使用 FindInstance 将实例名称转换回实例地址才能操作实例。
>>> 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'>]>
>>>