在 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)
).
和其他一些类似的关系,但参数量不同。不同对象中的某些属性我不需要或者我创建了一些平板电脑,有一天又添加了一个字段并开始在新平板电脑中使用它。
有两个问题:
- 我需要在序言中使用尽可能灵活的结构。有些平板电脑有attributes/innerPredicates有些平板电脑没有,但它们都是平板电脑。
- 我需要以最简单的方式访问数据,例如找到所有具有 ramCapacity(1024) 的平板电脑,不包括没有此属性的平板电脑。
- 我确实需要以最简单的方式更改某些属性的值。例如查询 - 将名称为 "tablet1".
的平板电脑的 ramCapacity 更改为 2048
- 如果可以的话用文字编辑器阅读应该很不错:)
这个结构灵活吗?我应该使用另一个吗?我需要额外的规则来操纵这个结构吗?这种结构是否易于通过查询更改?(我将这种结构保存在文件中)。
由于属性的个数不固定,需要非常灵活,考虑在选项列表中表示这些项目,像这样:
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
。
嗯,我对 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)
).
和其他一些类似的关系,但参数量不同。不同对象中的某些属性我不需要或者我创建了一些平板电脑,有一天又添加了一个字段并开始在新平板电脑中使用它。
有两个问题:
- 我需要在序言中使用尽可能灵活的结构。有些平板电脑有attributes/innerPredicates有些平板电脑没有,但它们都是平板电脑。
- 我需要以最简单的方式访问数据,例如找到所有具有 ramCapacity(1024) 的平板电脑,不包括没有此属性的平板电脑。
- 我确实需要以最简单的方式更改某些属性的值。例如查询 - 将名称为 "tablet1". 的平板电脑的 ramCapacity 更改为 2048
- 如果可以的话用文字编辑器阅读应该很不错:)
这个结构灵活吗?我应该使用另一个吗?我需要额外的规则来操纵这个结构吗?这种结构是否易于通过查询更改?(我将这种结构保存在文件中)。
由于属性的个数不固定,需要非常灵活,考虑在选项列表中表示这些项目,像这样:
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
。