пролог - нужно объяснить объединение и пересечение - PullRequest
2 голосов
/ 23 апреля 2011
/* e */
union([A|B], C, D) :- member(A,C), !, union(B,C,D).
union([A|B], C, [A|D]) :- union(B,C,D).
union([],Z,Z).

/* f */
intersection([A|B], C, D) :- member(A,C), !, intersection(B,C,D).
intersection([A|B], C, [A|D]) :- intersection(B,C,D).
intersection([],Z,[]).

Можете ли вы, ребята, объяснить, как эти выражения, может быть, в дереве, большое спасибо.Я очень новичок в прологе:)

1 Ответ

4 голосов
/ 23 апреля 2011

Моя память о прологе несколько ржавая, но я думаю, что это выглядит так:

Правило объединения, по сути, берет два списка и возвращает их объединение, например.union (List1, List2, UnionOfList1AndList2)

Первое правило

union([A|B], C, D) :- member(A, C), !, union(B, C, D)

Это будет совпадать, если совпадение member(A, C) (предположительно member(A, C) совпадение, если C является списком, содержащим значение, связанное сA), ! - сокращение, поэтому, если мы достигнем этого, мы не сможем отследить отсюда.Затем мы разрешаем оставшуюся часть списка с левой стороны.

По сути, мы говорим, что если заголовок List1 находится в List2, то результатом является объединение хвоста List1, объединенного с List2.(Технически это неверное описание того, что происходит, но я уверен, что это будет делать: D)

union([A|B], C, [A|D]) :- union(B, C, D)

Учитывая, что мы рассмотрели случай, когда A находится в List2, мы знаем, что на этот раз Aотсутствует в List2, поэтому мы добавляем его к «результату» объединения (B, C, D).

Наконец union([], Z, Z) говорит, что если List1 пуст, объединение List1 и List2 - это List2.

Правила пересечения существенно не отличаются.

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