получение остальной части предложения в виде списка и создание списка списков - PullRequest
2 голосов
/ 06 октября 2019

скажем, у меня есть несколько предложений, два из которых следующие:

has_basket('Sarah', 'bigBasket','apple','grape').
has_basket('Sarah', 'bigBasket','orange','berry').

Как мне написать правило с именем

all_baskets(S,L).

, которое даст мне списоквсе корзины, которые человек S имеет в следующем виде? например,

all_baskets('Sarah',L).

даст нам:

L=[['bigBasket','apple','grape], ['bigBasket','orange','berry']]

Ответы [ 2 ]

1 голос
/ 08 октября 2019

Всякий раз, когда вы рассматриваете проблему программирования на Прологе, вам необходимо уточнить аспекты, которые важны для вас.

  1. Подумайте о порядке двух элементов в списке. Они в таком порядке, потому что они в алфавитном порядке возрастания, или это просто удача?

  2. Что вы ожидаете для all_baskets('Nemo', L)? Если это не удастся, или, скорее, ответ L = []?

  3. Что вы ожидаете для all_baskets(P, [])?

Если вы скажете 1 алфавит,2 терпят неудачу, а 3 терпят неудачу, тогда setof/3 - путь.

has_basket('Sarah',  bigBasket, apple, grape).
has_basket('Sarah',  bigBasket, orange, berry).
has_basket('Bernie', bigBasket, orange, apple).  % another fact

all_baskets(P, L) :-
   setof([A, B, C], has_basket(P, A, B, C), L).

?- all_baskets(P, []).
false.

?- all_baskets('Nemo', L).
false.

?- all_baskets(P, L).
   P = 'Bernie',
   L = [[bigBasket, orange, apple]]
;
   P = 'Sarah',
   L = [[bigBasket, apple, grape], [bigBasket, orange, berry]].
1 голос
/ 06 октября 2019

Мы можем использовать предикат findall/3 [swi-doc] :

all_baskets(S,L) :-
    <b>findall(</b>[A, B, C], has_basket(S, A, B, C), L<b>)</b>.

Здесь [A, B, C] - это «шаблон»элементы в списке, has_basket(S, A, B, C) «цель», которая должна быть достигнута, и L список результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...