【问题标题】:Defining a flexible structure in Prolog在 Prolog 中定义一个灵活的结构
【发布时间】:2015-02-16 21:58:06
【问题描述】:

好吧,我对 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. 如果可能的话,在文字编辑器中阅读应该很漂亮:)

这种结构灵活吗?我应该使用另一个吗?我需要额外的规则来操作这个结构吗?这个结构容易用查询改变吗?(我把这个结构保存在一个文件中)。

【问题讨论】:

    标签: data-structures prolog


    【解决方案1】:

    由于属性的数量不是固定的,需要非常灵活,考虑将这些项目表示为选项列表,如下所示:

    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

    【讨论】:

    • 通过查询更新某些属性是否容易,例如:所有带有 operating_system=android 的平板电脑都将屏幕分辨率更改为 2048,2048?
    • 您可以使用类似?- tablet(Ts0), member(operating_system=android, Ts0), select(screen=screen(Scs0), Ts0, Ts1), select(resolution=_, Scs0, Scs1), Ts = [screen=screen([resolution=res(2048,2048)|Scs1])|Ts1]. 的查询来执行此操作,获取更新后的属性列表为Ts。在末尾附加portray_clause(tablet(Ts)) 以一种可以轻松替换该项目的先前定义的方式打印它。
    • 哦,谢谢,还有最后一个问题,错过了怎么插入属性?
    猜你喜欢
    • 2013-03-16
    • 1970-01-01
    • 2017-08-13
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 2015-05-24
    相关资源
    最近更新 更多