Моя память о прологе несколько ржавая, но я думаю, что это выглядит так:
Правило объединения, по сути, берет два списка и возвращает их объединение, например.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.
Правила пересечения существенно не отличаются.