在Prolog中定义灵活的结构

时间:2015-02-16 21:58:06

标签: data-structures prolog

好吧,我对Prolog有点新意,所以我的问题是关于Prolog模式/逻辑。

我有一种叫平板电脑的关系。它有许多参数,例如name,operationSystem,ramCapacity等。我有很多这种关系的对象/谓词,比如

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. 我需要在prolog中尽可能使用最灵活的结构。有些平板电脑有属性/ innerPredicates,有些没有,但它们都是平板电脑。
  2. 我需要以最简单的方式访问数据,例如找到所有具有ramCapacity(1024)的平板电脑,不包括那些没有此属性的平板电脑。
  3. 我确实需要以最简单的方式更改某些属性的值。例如,查询 - 将名称为“tablet1”的平板电脑的ramCapacity更改为2048。
  4. 如果可能的话,应该在单词编辑器中阅读:)
  5. 这种结构是否灵活?我应该再用一个吗?我是否需要其他规则来操纵此结构?这种结构是否容易随查询而改变?(我将此结构保存在文件中)。

1 个答案:

答案 0 :(得分:3)

由于属性数量不固定且需要如此灵活,因此请考虑将这些项目表示为选项列表,如下所示:

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