Объединение списков

member(2,[1,2,3,4]).

и

member(Х, [1, 2, 3, 4]).

В результате, первое целевое утверждение "просит" выяснить, верно ли утверждение, второе, — найти всех членов списка [1,2,3,4]. Предикат member одина­ков в обоих случаях, но его поведение может быть рассмотрено с разных точек зрения.

Рекурсия с процедурной точки зрения

Определим предикат append с тремя аргументами:

append(List1,List2,List3)

Он объединяет List1 и List2 и создает ListЗ. Если List1 пустой, то результатом объединения List1 и List2 останется List2. На Прологе это будет выглядеть так:

append([],List2,List2).

Если List1 не пустой, то можно объединить List1 и List2 для формирования ListЗ, сделав голову List1 головой List3. (В следующем утверждении переменная H ис­пользуется как голова для List1 и для List3.) Хвост List3 — это L3, он состоит из объединения остатка List1 (т. е. L1) и всего List2. То есть:

append([H|L1],List2,[H|L3]):-

append(L1,List2,L3).

1.4.5.2 Предикат может иметь несколько вариантов использования

Состояние аргументов при вызове предиката называется потоком параметров. Аргу­мент, который присваивается или назначается в момент вызова, называется входным аргументом и обозначается буквой i; а свободный аргумент — это выходной аргу­мент, обозначается буквой o.

У предиката append есть возможность работать с разными потоками параметров, в зависимости от того, какие исходные данные вы ему дадите. Однако не для всех предикатов имеется возможность быть вызванными с различными потоками пара­метров. Если предложение Пролога может быть использовано с различными пото­ками параметров, оно называется обратимым предложением. Когда вы записываете собственные предложения в Прологе, помните, что обратимые предложения имеют дополнительные преимущества, и их создание добавляет "мощности" преди­катам.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: