domains
list = integer*
predicates
length_of(list, integer)
clauses
length_of([], 0).
length_of([_|T], L) :- length_of(T,
TailLength),
L = TailLength + 1.
Поглянемо спочатку на другу фразу. Так,
length_of[_,|T] порівнює любий непустий список,
прив`язуючи T до хвосту списка. Значення голови не суттєво,
ЕОМ буде її рахувати як один елемент.
Так ціль
goal:length_of([1,2,3],L) ,
використовуючи другу фразу, зв'яже з T значення [2,3].
Наступний крок - обчислити довжину T. Коли це зроблено, не
важливо як, тоді TailLength отримає значення 2, і ЭВМ потім
зможе добавити до неї 1 та прив'язати L до 3.
Для того, щоб визначити довжину [2,3]
рекурсивно викличеться length_of([2,3],TailLength. Ця
ціль зрівнює другу фразу, прив'язуючи - [3] до T . Тепер
виникає задача, як знайти довжину [3], яка дорівнює 1, а
потім добавить 1, щоб отримати довжину [2,3], яка буде 2. І
так далі і тому подібно. Тому length_of знов викличе себе
рекурсивно, щоб отримати довжину списку [3]. Хвіст для [3]
рівний [ ], тому T зв'яжеться з [], і задача зараз полягає в тому ,
щоб знайти довжину [], потім додати до неї 1, і знайти
довжину [3].На цей раз це зробити легко. Ціль
length_of([],Tail Length зрівнюючи першу фразу,
зв'яже TailLength з 0. Тепер ЭОМ може додати 1 до неї,
отримуючи довжину списку [3] і повернутися до фрази
виклику. Яка , в свою чергу , прибавить знову 1 , отримуючи
93