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)