Print_countries
Goal print_countries.
После того, как выведен на экран очередной результат, стандартный предикат fail завершает работу предиката print_countries ложно и побуждает Пролог к поиску других решений. Когда будут найдены все решения, второй клоз предиката print_countries позволит программе завершиться истинно.
4. Программа решение квадратного уравнения – типичный пример реализации на Прологе разветвляющегося алгоритма.
predicates
solve(real, real, real) % Запуск программы
reply(real, real, real) % Ветви вычислений
mysqrt(real, real, real) % Вычисление квадратного корня
equal(real, real) % Проверка на равенство
clauses
solve(A, B, C) :– D = B*B-4*A*C, % вычисление дискриминанта
reply(A, B, D), nl.
reply(_, _, D) :– D < 0, write("No solution"), !.
reply(A, B, D) :– D = 0, X=-B/(2*A), write("x=", X), !.
reply(A, B, D) :–
sqrt(D, D, SqrtD),
X1 = (-B + SqrtD)/(2*A),
X2 = (-B – SqrtD)/(2*A),
write("x1 = ", X1," and x2 = ", X2).
Goal solve(3,4,5).
5. Логический вывод. Имеется следующая задача из психологического практикума.
Бутси – коричневая кошка. Корни – черная кошка. Мак – рыжая кошка. Флэш, Ровер, Спот – собаки, Ровер – рыжая, а Спот – белая. Все животные, которыми владеют Том и Кейт, имеют родословные. Том владеет всеми черными и коричневыми животными, а Кейт владеет всеми собаками небелого цвета, которые не являются собственностью Тома. Алан владеет Мак, если Кейт не владеет Бутси и если Спот не имеет родословной. Флэш – пятнистая собака. Определить, какие животные не имеют хозяев. (Ответ: Спот).
Predicates
Cat(string)
Dog(string)
Color(string,string)
Have(string,string)
Rod(string)
Animal(string)
Clauses
Cat(butsi). cat(korni). cat(mac).
dog(rover). dog(fles). dog(spot).
Color(butsi,brown).
Color(korni,black).
Color(mac,yellow).
Color(rover,yellow).
Color(spot,white).
color(fles,black_and_white).
have(tom,X):–color(X,black); color(X,brown).
have(keit,X):–dog(X), not(color(X,white)), not(have(tom,X)).
have(alan,mac):–not(have(keit,butsi)), not(rod(spot)).
rod(X):–animal(X), have(tom,X).
rod(X):–animal(X), have(keit,X).
animal(X):–cat(X); dog(X).
Goal animal(X),not(have(_,X)),write(X).
Рекурсии
В Прологе заложено мощное средство, позволяющее определять некоторые отношения, используя эти же отношения, и называемое рекурсией. Подробнее, правило является рекурсивным, если оно вызывает само себя в виде подцели, содержащейся в теле по крайней мере одного из ее утверждений.
6. Примером рекурсивных вычислений является известный алгоритм вычисления факториала. Hа Прологе эта программа может иметь такой вид:
Domains
N, F=real
Predicates
Factorial(N,F)