在 Prolog 中定义灵活的结构

Defining a flexible structure in Prolog

嗯,我对 Prolog 有点陌生,所以我的问题是关于 Prolog pattern/logic。

我有一个叫做平板电脑的关系。它有很多参数,比如name,operationSystem,ramCapacity等等。这个关系我有很多objects/predicates,比如

tablet(
         name("tablet1"),
         operatingSystem("ios"),
         ramCapacity(1024),
         screen(
                  type("IPS"),
                  resolution(1024,2048)
               )
      ).

tablet(
         name("tablet2"),
         operatingSystem("android"),
         ramCapacity(2048),
         screen(
                  type("IPS"),
                  resolution(1024,2048),
                  protected(yes)
               ),
          isSupported(yes)
      ).

和其他一些类似的关系,但参数量不同。不同对象中的某些属性我不需要或者我创建了一些平板电脑,有一天又添加了一个字段并开始在新平板电脑中使用它。

有两个问题:

  1. 我需要在序言中使用尽可能灵活的结构。有些平板电脑有attributes/innerPredicates有些平板电脑没有,但它们都是平板电脑。
  2. 我需要以最简单的方式访问数据,例如找到所有具有 ramCapacity(1024) 的平板电脑,不包括没有此属性的平板电脑。
  3. 我确实需要以最简单的方式更改某些属性的值。例如查询 - 将名称为 "tablet1".
  4. 的平板电脑的 ramCapacity 更改为 2048
  5. 如果可以的话用文字编辑器阅读应该很不错:)

这个结构灵活吗?我应该使用另一个吗?我需要额外的规则来操纵这个结构吗?这种结构是否易于通过查询更改?(我将这种结构保存在文件中)。

由于属性的个数不固定,需要非常灵活,考虑在选项列表中表示这些项目,像这样:

tablet([name=tablet1,
        operating_system=ios,
        ram_capacity=1024,
        screen=screen([type="IPS",
                       resolution = res(1024,2048)])]).

tablet([name=tablet2,
        operating_system=android,
        ram_capacity=2048,
        screen=screen([type="IPS",
                       resolution = res(1024,2048)]),
        is_supported=yes]).

您可以轻松查询和任意扩展此类列表。示例:

?- tablet(Ts), member(name=tablet2, Ts).
Ts = [name=tablet2, operating_system=android, ram_capacity=2048, screen=screen([type="IPS", resolution=res(..., ...)]), is_supported=yes] ;
false.

另请注意常用的 Prolog naming_convention_to_use_underscores_for_readability 而不是 mixingCasesAndMakingEverythingExtremelyHardToRead