Получить все элементы типа Пролог - PullRequest
2 голосов
/ 20 июня 2019

Я объявил тип объектов следующим образом:

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

Как получить список всех объектов типа drink?

Ответы [ 2 ]

4 голосов
/ 20 июня 2019

Вы можете использовать объединение, например:

type(<b>L</b> : 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 s:

?- 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 голос
/ 20 июня 2019

Если вы настаивали на представлении, вы можете использовать memberchk/2 для определения отношения типа объекта следующим образом:

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