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