Механизм вывода в системе Пролог, страница 6

перевести([С_А|Ф_А], [С_Р|Ф_Р]) :-
словарь(С_А, С_Р), перевести(Ф_А, Ф_Р).

Это правило интерпретируется следующим образом:

чтобы перевести фразу с английского на русский, выбирают ее первый элемент (слово С_А), находят в словаре соответст­вующее русское слово (С_Р), которое добавляют в начало рус­ской фразы.

Далее с помощью рекурсии осуществляют перевод ос­тавшейся части фразы. Естественно, что для работы програм­мы требуется создать англо-русский словарь. Полная про­грамма имеет следующий вид:

domains

список = symbol

predicates

перевести (список, список)

словарь (symbol, symbol)

clauses

перевести ([], []).

перевести ([С_А|Ф_А], [С_Р|Ф_Р]):-

словарь (С_А, С_Р),

перевести (Ф_А, Ф_Р).

словарь ("I";"я").

словарь ("study","изучаю").

словарь ("language","язык").

словарь ("PROLOG","Пролог").

словарь ("in","в").

словарь ("the university","университете").

На запрос

перевести(["I", "study", "language", "PROLOG", "in", "the university"],P)

получим

Р = ["Я", "изучаю", "язык", "Пролог", "в", "университете"]

Можно также задать обратный запрос:

перевести(Р, ["Я", "изучаю", "язык", "Пролог", "в", "университете"])

и на экране получим соответствующую английскую фразу. Вполне понятно, что такой перевод не является совершенным. Пополняя словарь, можно получить множество русских фраз, соответствующих английской фразе. Для выбора правильной фразы требуется использовать правила грамматики, семанти­ческий анализ полученных фраз. Следует напомнить, что язык Пролог появился как средство исследования естественных языков.

Удаление заданного элемента из списка. Для выпол­нения этой операции достаточно соблюдать два правила:

1) если удаляемый элемент совпадает с головой списка, то надо оставить хвост списка. Это записывается так:

удалить (Е, [E|Y], Y).

В первом правиле если Е - элемент для удаления и Е - голова списка, то сохраняется хвост списка Y;

2) если удаляемый элемент не совпадает с головой спи­ска, то надо найти его в хвосте списка и удалить. Это можно записать таким образом:

удалить(Е, [X | Y], [X | Z]) :- удалить(Е, Y, Z).

Из второго правила следует, что если Е - элемент для удаления и [X|Y] - исходный список, то нужно анализировать подсписок Y на предмет наличия в нем искомого элемента.

Программа имеет следующий вид:

удалить(Е, [Е | Y], Y).

удалить(Е, [X | Y], [X | Z]) :- удалить(Е, Y, Z).

Сортировка элементов списка. Рассмотрим простую сортировку элементов с помощью метода последовательного сравнения смежных элементов. По данному методу в списке находят наименьший элемент, если сортировка по возраста­нию (или наибольший, если по убыванию), добавляют его в голову другого списка и удаляют из первого списка. Далее этот процесс продолжают с оставшимся первым списком до исчезновения в нем элементов.

Таким образом, окончание сортировки можно предста­вить в виде

сортировать([], []).

Выбор наименьшего М в исходном списке L, удаление М из L, сортировка оставшегося списка Q и получение резуль­тата в списке R можно представить следующим правилом:

сортировать(L, [M|R]) :-
меньший(L, М), удалить(М, L, Q), сортировать(Q, R), !.

На запрос сортировать([е, t, r, a, b], S) получим

S = ["a","b","e","r";"t"]

Задание к лабораторной работе1.

По заданным отношениям построить базу фактов генеалогического дерева. Написать правила для установления родственных связей, таких как: сестра, брат, супруг, супруга, супруги, муж, жена, сын, дочь, двоюродная сестра, двоюродный брат, дядя, тетя, дедушка, бабушка, прадедушка, прабабушка.

Задание повышенной трудности: кровные (общий предок), сводные, шурин, деверь, золовка…

Подсказка: использовать следующие рекурсивные правила:

предок(X,Z) :- родитель(X,Z).

предок(X,Z) :- родитель(X,Y), предок(Y,Z).

Варианты для построения базы фактов (по номеру компьютера):

1.   

11.  

отец(a,b). мать(a,b). мужчина(a).

2.   

12.  

сын(a,b). дочь(a,b). мужчина(a).

3.   

13.  

сын(a,b,c). дочь(a,b,c).

4.   

14.  

супруг(a,b). женщина(a).

5.   

15.  

муж(a,b). сын(a,b). дочь(a,b).

6.   

16.  

родитель(a,b). женщина(a).

7.   

17.  

отпрыск(a,b). мужчина(a).

8.   

18.  

сестра(a,b). брат(a,b). родитель(a,b).

9.   

19.  

родители(a,b,c). женщина(a).

10.  

20.  

жена(a,b). сын(a,b). дочь(a,b).


Задание к лабораторной работе№2.

1.  Написать программу, которая на запрос реки([Архангельск, Питер, Москва],P) выводила P = [Северная Двина, Нева, Яуза].

2.  Как известно, n! = 1*2*3*…*n. Написать программу для поиска Sn = 1+2+3+…+n.

3.  Написать программу для преобразования списка вида [‘Москва’, ‘Киев’, ‘Рязань’, ‘Белгород’, ‘Архангельск’] к виду [‘Архангельск’, ‘Белгород’, ‘Киев’, ‘Москва’, ‘Рязань’].

4.  На заданный список городов вывести список в порядке убывания количества жителей. Необходимо использовать факт вида
              население(‘Москва’,10000).
Население взято в тысячах.

5.  Написать программу определения времени пути между двумя городами. При описании сети дорог необходимо задавать только один вариант пути (для упрощения задачи), т.е. используется топология дерева, например с вершиной в Москве. Для описания БФ использовать отношение:
дорога(город, город, расстояние, скорость).