PyClips:创建包含对其他剪辑实例

时间:2015-12-12 18:19:36

标签: python clips expert-system

一个人可以拥有几辆汽车,但一辆汽车只有一个人拥有。 在剪辑中

(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。 现在我想将现有的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:类型为<class 'clips._clips_wrap.Instance'>的列表元素   无法转换

据我所知,这是一个问题,因此pyclips会将一个实例列表添加到一个插槽中。如果它只是一个实例(没有列表),这可以正常工作:

clips_car_instance.Slots["owner"] = clips_person_instance

我的问题:如何“链接”到(py)剪辑中的类实例?用OO-words:如何在两个对象之间创建关联?如何在(py)剪辑中创建“1对多”关系?

1 个答案:

答案 0 :(得分:1)

看起来事实和实例地址在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'>]>
>>>