Директивы компилятора. Рекурсия на Прологе Лекция 4
План Структура программы на Прологе. Домены: стандартные, списковые, составные. Альтернативные домены. Рекурсия в Прологе.
Директивы компилятора trace nowarnings include check_determ
Константы CONSTANTS pi=3.14 bgi_path="c:\\prolog\\bgi"
Домены integer - целое число ( ); real - действительное число (±e ±1e 308 ); char - символ в одиночных апострофах; string - последовательность символов в «»; symbol - символическая константа (атом); file - файл.
Стандартные предикаты readln readint readreal readchar inkey keypressed readterm write nl upper_lower str_int str_real str_char char_int true fail bound
Программа «Родственники» предок(Предок,Потомок):- родитель(Предок,Потомок). /* предком является родитель */ предок(Предок,Потомок):- родитель(Предок,Человек), предок(Человек,Потомок). /* предком является родитель предка */
Правило, реализующее шаг рекурсии :- [ ],, [ ].
Программа «Факториал» 1!=1 /* факториал единицы равен единице */ N!=(N-1)!*N /* для того, чтобы вычислить факториал некоторого числа, нужно вычислить факториал числа на единицу меньшего и умножить его на исходное число */
Факториал fact(1,1). /* факториал единицы равен единице */ fact(N,F):- N1=N-1, fact(N1,F1), /* F1 равен факториалу числа на единицу меньшего исходного числа */ F=F1*N. /* факториал исходного числа равен произведению F1 на само число */
Факториал fact(1,1). /* факториал единицы равен единице */ fact(N,F):- N>1, /* убедимся, что число больше единицы */ N1=N-1, fact(N1,F1), /* F1 равен факториалу числа, на единицу меньшего исходного числа */ F=F1*N. /* факториал исходного числа равен произведению F1 на само число */
Факториал fact(1,1):-!. /* условие останова рекурсии */ fact(N,F):- N1=N-1, fact(N1,F1), /* F1 равен факториалу числа, на единицу меньшего исходного числа */ F=F1*N. /* факториал исходного числа равен произведению F1 на само число */
Факториал fact2(N,F,N,F):-!. /* останавливаем рекурсию, когда третий аргумент равен первому*/ fact2(N,F,N1,F1):- N2=N1+1, /* N2 - следующее натуральное число после числа N1 */ F2=F1*N2, /* F2 - факториал N2 */ fact2(N,F,N2,F2). /* рекурсивный вызов с новым натуральным числом N2 и соответствующим ему посчитанным факториалом F2 */
Факториал factM(N,F):- fact2(N,F,1,1). /* вызываем предикат с уже заданными начальными значениями */