我声明了一种对象类型,如下所示:
type([coffee, tea, lemonade, water, coke, beer]: drink).
如何获取 drink
类型的所有对象的列表?
您可以使用统一,例如:
type(L : drink).
这将L
与该列表统一,例如:
?- type(L: drink).
L = [coffee, tea, lemonade, water, coke, beer].
话虽如此,在这里使用冒号(:
(并不常见,通常使用不同的参数。此外,列表在事实中也不是很常见,因为您因此失去了轻松检查tea
类型的能力。
写起来更惯用:
type(coffee, drink).
type(tea, drink).
type(lemonade, drink).
type(water, drink).
type(coke, drink).
type(beer, drink).
例如,我们可以查询类型为 drink
的元素:
?- type(D, drink).
D = coffee ;
D = tea ;
D = lemonade ;
D = water ;
D = coke ;
D = beer.
或者查询water
的类型:
?- type(water, T).
T = drink.
检查newspaper
或coke
是否drink
:
?- type(newspaper, drink).
false.
?- type(coke, drink).
true.
并枚举所有项目及其类型:
?- type(X, T).
X = coffee,
T = drink ;
X = tea,
T = drink ;
X = lemonade,
T = drink ;
X = water,
T = drink ;
X = coke,
T = drink ;
X = beer,
T = drink.
然后,您可以使用 [swi-doc] 谓词findall/3
创建一个列表:
?- findall(D, type(D, drink), Ds).
Ds = [coffee, tea, lemonade, water, coke, beer].
如果你坚持表示,你可以使用 memberchk/2
来定义一个对象类型关系,如下所示:
object_type(O, T) :-
type(Os:T),
memberchk(O, Os).