获取Prolog类型的所有元素

时间:2019-06-20 10:36:23

标签: prolog swi-prolog

我声明了一种对象,如下所示:

type([coffee, tea, lemonade, water, coke, beer]: drink).

如何获取drink类型的所有对象的列表?

2 个答案:

答案 0 :(得分:4)

您可以使用统一,例如:

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.

检查newspapercokedrink

?- 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.

然后可以使用findall/3 [swi-doc]谓词创建列表:

?- findall(D, type(D, drink), Ds).
Ds = [coffee, tea, lemonade, water, coke, beer].

答案 1 :(得分:1)

如果您坚持表示形式,则可以使用memberchk/2来定义这样的对象类型关系:

object_type(O, T) :-
    type(Os:T),
    memberchk(O, Os).