Вычисление длины списка на Прологе


Добавил:DMT
Дата создания:6 января 2008, 15:11
Дата обновления:17 января 2008, 16:44
Просмотров:8318 последний 8 апреля, 4:03
Комментариев: 0

Вычисление длины списка на Прологе

Код на Lisp
  1. domains
  2. s=symbol
  3. i=integer
  4. ss=s*
  5. predicates
  6. length(i,ss).
  7. clauses
  8. length(0,[ ]).
  9. length(U1,[D|F]):-length(U,F),U1=U+1.
  10. goal
  11. length(U,[b,a,c,d]),write(U).
При использовании обязательна ссылка на http://DMTSoft.ru
Восходящая рекурсия - промежуточные результаты вычисляются на некоторой стадии рекурсии, так что ответ строится постепенно и передается в виде параметра рабочей памяти до тех пор. пока не будет достигнута некоторая ( терминальная ) ситуация. К этому моменту ответ уже готов, и нужно передать его вызывающей функции верхнего уровня. Пример 1
Код на Lisp
  1. /*Вычисление длины списка с помощью восходящей рекурсии */
  2. domains
  3. sl = symbol*
  4. nl = integer*
  5. predicates
  6. list_len ( sl, integer )
  7. list_len ( nl, integer )
  8. l_l ( sl, integer, integer )
  9. l_l ( nl, integer, integer )
  10. clаuses
  11. list_len ( X, N ) :- l_l ( X, N, 0 ).
  12. l_l ( [ ], N, N ).
  13. l_l ( [ _ | R ], N, N1 ) :- N2 = N1 + 1, l_l ( R, N, N2 ).
При использовании обязательна ссылка на http://DMTSoft.ru
В некоторых случаях, при использовании рекурсии, результат вычисляется по-разному, следовательно, он зависит от выбора вида рекурсивной функции.
up