14. Язык Пролог. Решения задач



Скачать 115.7 Kb.
Дата11.07.2014
Размер115.7 Kb.
ТипПрограмма
14. Язык Пролог. Решения задач.

Пролог–программа предназначена для решения отдельной задачи. В связи с этим Пролог считается декларативным языком программирования.( построенный: - на описании данных; и - на описании искомого результата).

Пролог может быть использован в различных приложениях, относящихся к искусственному интеллекту :

– общение с ЭВМ на естественном языке;

– символьные вычисления;

– написание компиляторов;

– базы данных;


  • экспертные системы и т. д

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

– константы;

– переменные;

– предикаты, структуры (составные термы или функции), состоящие из имени предиката и списка аргументов-термов; имена предикатов начинаются со строчной буквы.

Константы – это поименованные конкретные объекты или отношения. Константа начинается со строчной буквы, либо заключаются в одинарные кавычки. Также константа может быть числом.

Переменные служат для обозначения объектов, значения которых меняются в ходе выполнения программы. Имена переменных начинаются с заглавных букв или знака «_». Область действия переменной – предложение. Одноименные переменные в разных предложениях могут иметь разные значения.

Предикат – это единый объект, состоящий из совокупности других объектов, называемых компонентами. Компоненты в свою очередь могут быть также предикатами. Название предиката стоит перед скобками, а компоненты внутри скобок перечисляются через запятую. Название предиката – функтор. владелец (иван, книга(война и мир)).

Функтор различается двумя параметрами (именем и числом параметров):

– point(X, Y, Z) и point(X, Y) – разные предикаты

– point/3 - это означается, что у предиката point 3 аргумента,

– point/2 - это означается, что у предиката point 2 аргумента.

Программа на прологе состоит из предложений, которые могут быть фактами, правилами или вопросами.

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


-Имена всех отношений и объектов с маленькой буквы.

-Сначала записывается имя отношения, затем в круглых скобках через запятую объекты.

-В конце ставится точка.

Введем отношение -родитель- (parent) между объектами.

parent (tom, bob).

Это факт, определяющий , что Том является родителем Боба.

Вопрос в обычном прологе начинается с ?-

? - parent (bob, pat).

Yes

?-parent (Y, juli), parent (X, Y).



X=bob

Y=pat


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

child(Y, X) :- parent (X, Y).

eсли условие parent (X, Y).

выполняется, то логическим следствием из него будет утверждение child(Y, X).

parents("Alexey I", "Fedor II").

parents("Alexey I", "Ivan V").

parents("Alexey I", "Sofi").

parents("Alexey I", "Petr I").

parents("Ivan V", "Anna Ioanovna").

parents("Ivan V", "Ekaterina").

parents("Ekaterina", "Anna Leopoldovna").

parents("Anna Leopoldovna", "Ivan VI").

parents("Petr I", "Alexey II").

parents("Mary", "Fedor II").

parents("Mary", "Ivan V").

parents("Mary", "Sofi").

parents("Petr I", "Elizaveta").

parents("Petr I", "Anna").

parents("Ekaterina I", "Elizaveta").

parents("Ekaterina I", "Anna").

parents("Anna", "Petr III").

parents("Petr III","Pavel I").

parents("Ekaterina II", "Pavel I").

parents("Pavel I", "Alexander I").

parents("Pavel I", "Nikolay I").

parents("Nikolay I", "Alexander II").

parents("Alexander II", "Alexander III").

parents("Alexander III", "Nikolay II").

parents("Nataly", "Petr I").

parents("Nataly", "Ekaterina I").

woman("Nataly").

woman("Ekaterina II").

woman("Sofi").

woman("Anna Ioanovna").

woman("Ekaterina").

woman("Anna Leopoldovna").

woman("Ekaterina I").

woman("Elizaveta").

woman("Anna").

woman("Mary").

man("Alexey I").

man("Fedor II").

man("Ivan V").

man("Petr I").

man("Ivan VI").

man("Alexey II").

man("Petr III").

man("Pavel I").

man("Alexander II").

man("Alexander III").

man("Alexander I").

man("Nikolay I").
emperor("Petr III", 1761,1762).

emperor("Ekaterina II",1762,1796).

emperor("Pavel I", 1796,1801).

emperor("Alexander I",1801,1825).

emperor("Nikolay I",1825,1855).

emperor("Alexander II",1855,1881).

emperor("Alexander III",1881,1894).

emperor("Nikolay II",1894,1917).


father(X,Y):-parents(X,Y),man(X).

mother(X,Y):-parents(X,Y),woman(X).

brother(X, Y):-mother(Z, X), mother(Z, Y),father(P, X), father(P, Y), man(X), X=\=Y.

sister(X, Y):-parents(Z, X),parents(Z, Y),woman(X), X=\=Y.

uncle(X, Y):-parents(Z, Y),brother(X, Z).

aunt(X, Y):-mother(Z, Y), sister(X, Z); father(P, Y), sister(X, P).

grandma(X,Y):-parents(X,Z),parents(Z,Y),woman(X).

grandfa(X,Y):-parents(X,Z),parents(Z,Y),man(X).

grandson(X,Y):-grandma(Y, X),man(X).

grandson(X,Y):-grandfa(Y, X),man(X).

granddau(X,Y):-parents(Z,X),parents(Y,Z),woman(X).

kuz(X,Y):-uncle(Z,Y),parents(Z,X).

kuz(X,Y):-aunt(Z,Y),parents(Z,X).

svod(X, Y):-father(Z,X),father(Z,Y), mother(T,X), mother(P,Y), X\=Y, T\=P.

svod(X, Y):-father(T,X),father(P,Y), mother(Z,X), mother(Z,Y), X\=Y, T\=P.

prav(X, Y):-emperor(X, Z, H), Y==Z.


%?-brother(X, Y),write(X),write(" is brother of "), write(Y), nl.

%?-sister(X, "Alexander I"), write(X), nl.

%?-uncle(X, Y), write(X), write(" is uncle of "), write(Y), nl.

%?-aunt(X, Y), write(X), write(" is aunt of "), write(Y), nl.

%?-grandma(X,Y), write(X), write(" is grandma of "), write(Y), nl.

%?-grandfa(X,Y), write(X), write(" is grandfa of "), write(Y), nl.

%?-grandson(X,Y), write(X), write(" is grandson of "), write(Y), nl.

%?-granddau(X,Y), write(X), write(" is granddau of "), write(Y), nl.

%?-kuz(X,Y), write(X),write(" is kuz of "), write(Y), nl.

%?-svod(X,Y), write(X),write(" is svod of "), write(Y), nl.

%?-prav(X, 1796), write(X), nl.

%sum - summa elmentof chislovogo spiska

sum([],0).

sum([H|T],S):- sum(T,S1), S:=S1+H.
%avg - crednee znachenie elementof spiska

len([],0).

len([H|T],K):-len(T,K1),K is 1+K1.

avg([H|T],Sr):-sum([H|T],S1),len([H|T],L1), Sr:=S1/L1.


%last- vosvrashaet posledni element spiska

last([],[]):-!.

last([H],H):-!.

last([H|T],L):-last(T, L).


%totail - dobavliyushii element v xvost spiska

totail([],X,[X]):-!.

totail([H|T],X,S):-totail(T,X,S1), S=[H|S1].
%rotate - perevorachivaet spisok

rotate([],[]):-!.

rotate([H|T],S):-rotate(T,S1), totail(S1,H,S).
%palindrom - proveriet YAvlietci li spisok palindromom

palindrom(L):-rotate(L,L).


%?-sum([1,2,3,4,5,6,7,8,9,10],S), write(S), nl.

%?-len([1,2,3,4,5,6,7,8,9,10],S), write(S), nl.

%?-avg([1,2,3,4,5,6,7,8,9,10],S), write(S), nl.

%?-last([1,2,3,4,5,6,7,8,9], L), write(L), nl.

%?-totail([1,2,3],4,S), write(S), nl.

%?-rotate([1,2,3],S), write(S), nl.



?-palindrom([1,2,3,2,1]), nl.




Практикум по LISP. Список задач













1

Количество атомов в списке

2

Оставить в списке только атомы

3

Получить глубину списка

4

Вставить элемент в список, не нарушая упорядоченности

5

Отсортировать список

6

Слияние двух упорядоченных списков

7

Максимальный элемент списка

8

Сумма элементов списка

9

Длина списка

10

Среднее арифметическое списка

11

Луковица

12

Факториал

13

Число Фибоначчи

14

Последовательность Фибоначчи

15

Есть ли элемент в списке

16

Преобразовать список в множество

17

Удалить элемент из списка

18

Объединение множеств

19

Пересечение множеств

20

Разность множеств

21

Симметрическая разность множеств

22

Является ли первое множество подмножеством второго

23

Равны ли два множества







(defun mynod (x y)

(cond

((= y 0) x)



(t (mynod y (mod x y)))

)

)


(defun myonlyatom (l)

(cond


((null l) 0)

((atom l) l)

((atom (car l)) (cons (car l) (myonlyatom (cdr l))))

(t (myonlyatom(cdr l)))

)

)
(defun mylistglubina(l)



(cond

((null l) 0)

((atom l) 0)

((atom (car l)) (max 0 (mylistglubina (cdr l))))

(t (max (+ 1 (mylistglubina (car l))) (mylistglubina (cdr l))))

)

)


(defun mynewelement (x l)

(cond


((null l) (list x))

((< x (car l)) (cons x l))

(t (> x (car l)) (cons (car l) (mynewelement x (cdr l))))

)

)


(defun mysortlist (l)

(cond


((null l) NIL)

((atom l) l)

(t (mynewelement (car l) (mysortlist(cdr l))))

)

)


(defun mymergelist (a b)

(cond


((null a) b)

((null b) a)

(t (mymergelist (cdr a) (mynewelement (car a) b)))

)

)


(defun mylastatom (l)

(cond


((null l) nil)

((null (cdr l)) (car l))

(t (mylastatom (cdr l)))

)

)


(defun mymaxlistatom (l)

(cond


((atom l) l)

(t (mylastatom (mysortlist l)))

)

)
(defun mysumlist (l)



(cond

((null l) 0)

(t (+ (car l) (mysumlist(cdr l))))

)

)


(defun mylistlen2 (l)

(cond


((null l) 0)

(t (+ 1 (mylistlen2 (cdr l))))

)

)
(defun mysrarifm (l)



(cond

((atom l) l)

(t (/ (mysumlist l) (mylistlenatom l)))

)

)


(defun myonion (x)

(cond


((= 0 x) 0)

(t (list (myonion (- x 1))))

)

)
(defun myfac (x)



(cond

((= x 0) 1)

(t (* x (myfac (- x 1))))

)

)


(defun myfib (x)

(cond


((null x) nil)

((= x 0) 0)

((= x 1) 1)

((= x 2) 1)

(t (+ (myfib(- x 1)) (myfib(- x 2))))

)

)


(defun myfibseq (x)

(cond


((eq x 0) nil)

(t (append (myfibseq (- x 1)) (list (myfib x))))

))
(defun myeqatominlist (x l)

(cond


((atom l) (eq x l))

((myeqatominlist x (car l)))

(t (myeqatominlist x (cdr l)))

)

)


(defun myuniontolist (a)

(cond


((NULL (car a)) nil)

(t (cons (car a) (myuniontolist (mydeletefromlist (car a) (cdr a)))))

))
(defun mydeletefromlist (x l)

(cond


((null l) nil)

((eq (car l) x) (mydeletefromlist x (cdr l)))

(t (cons (car l) (mydeletefromlist x (cdr l))))

)

)


(defun mysetunion (a b)

(cond


((null a) b)

((member (car a) b) (mysetunion (cdr a) b))

(t (mysetunion (cdr a) (cons (car a) b)))

)

)


(defun myinterunion (a b)

(cond


((null a) nil)

((member (car a) b) (cons (car a) (myinterunion (cdr a) b)))

(t (myinterunion (cdr a) b))

)

)


(defun mydifunion (a b)

(cond


((null a) nil)

((member (car a) b) (mydifunion (cdr a) b))

(t (cons (car a) (mydifunion (cdr a) b)))

)

)


(defun mysymdifunion (a b) (mysetunion (mydifunion a b) (mydifunion b a)))
(defun mysubset (a b)

(cond


((null a) t)

((member (car a) b) (mysubset (cdr a) b))

(t nil)

)

)


(defun mywellunion (a b)

(cond


((atom a)

(cond


((atom b) (eq a b))

(t nil)


))

((atom b) (eq b a))

((eq (car a) (car b)) (eq (cdr a) (cdr b)))

(t nil)


))


18. Язык Лисп. Решение задач

Основной механизм языка Лисп — инкапсулированная в список определяющая голова списка и подключённый к ней хвост списка, который рекурсивно также может быть списком. Лисп-машина способна воспринимать каждый поступающий на неё список на самом абстрактном уровне.

Любая программа на языке Лисп состоит из последовательности выражений (форм). Результат работы программы состоит в вычислении этих выражений. Все выражения записываются в виде списков — одной из основных структур Лиспа, поэтому они могут легко быть созданы посредством самого языка. Это позволяет создавать программы, изменяющие другие программы

Идеология Лиспа крайне проста: данные и программы представляются в нем в одной и той же форме. Благодаря такой униикации представления данные могут интерпретироваться как програм-

ма, а любая программа может быть использована как данные любой другой программой.



Основные положения программирования на Лиспе.

Лисп ориентирован на обработку нечисловых задач. Он основан на алгебре

списочных структур, лямбда-исчислении и теории рекурсий.

Язык имеет функциональную направленность, т. е. любое предложение

заключенное в скобки, введенное вне редактора считается функцией и

выполняется сразу после нажатия «ENTER».

Чтобы предотвратить вычисление значения выражения, нужно перед этим

выражением поставить апостроф «’». Апостроф перед выражением - это на самом

деле сокращение лисповской функции QUOTE.

В Лиспе формы представления программы и обрабатываемых ею данных одинаковы.

И то и другое представляется списочной структурой имеющей одинаковую форму.

Типы данных не связаны с именами объектов данных, а сопровождают сами

объекты. Переменные могут в различные моменты времени представлять

различные объекты.

Основные типы данных языка - атомы и списки.

Атомы - это символы и числа.

Список - упорядоченная последовательность, элементами которой

являются атомы либо списки. Списки заключаются в круглые скобки, элементы

списка разделяются пробелами. Несколько пробелов между символами

эквивалентны одному пробелу. Первый элемент списка называется «головой», а

остаток , т. е. список без первого элемента, называется «хвостом. Список в

котором нет ни одного элемента, называется пустым и обозначается «()» либо

NIL.

Функция CAR предназначена для извлечения первого элемента списка, который возвращается в качестве ее результата. Например,



(car '(1 2 3 4 5))

вернет 1


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

(cdr '(1 2 3 4 5))

(2 3 4 5)

CONS, наоборот, производит слияние двух аргументов, формируя из них список, который возвращается в качестве результата. Функция принимает ровно 2 (!) аргумента, первый из которых используется в качестве CAR-части списка, а второй - в качестве его CDR-части. Это очень важно - первый аргумент рассматривается функцией cons именно как элемент вновь формируемого списка

Предикат ATOM проверяет, является ли аргумент атомом. Аргу-

ментом может быть любое S-выражение. Значение предиката равно T,

если значение аргумента - атом, и NIL, когда значение аргумента -

не атом.

Предикат EQ проверяет тождественность двух символов. Предикат

EQ принимает значение T, если символы идентичны, и значение NIL во

всех других случаях, включая случаи, когда аргументами являются не

символы.
(defun mylistlenatom (l)

(cond


((null l) 0)

((atom (car l)) (+ 1 (mylistlenatom (cdr l))))



(t (+ (mylistlenatom (car l)) (mylistlenatom (cdr l))))

)

)

Похожие:

14. Язык Пролог. Решения задач iconЯзык Пролог Пролог (Prolog)
Пролог декларативный язык, который основывается на исчисление предикатов и при работе с которым необходимо описать ситуацию (правила...
14. Язык Пролог. Решения задач icon3. Логическое программирование 2 Язык Пролог 2
Пролог является декларативным языком логического программирования. Он основывается на языке исчисления предикатов первого порядка...
14. Язык Пролог. Решения задач icon«Многогранники и тела вращения» (решение задач)
Проверка решения домашних задач. На доске оформлены решения задач. Учащиеся определяют номер задачи в тетради, сверяют ответы
14. Язык Пролог. Решения задач iconUse of information technology for identification of filtration parameters мухамбетжанов С. Т
Алгоритмы решения обратных задач базируются на алгоритмах решения прямых краевых задач. Поэтому в работе рассматриваются постановки...
14. Язык Пролог. Решения задач iconПролог – субд будущего
Для этого метод логического вывода, применяющийся для решения вышеназванных задач, требует доработки в части организации вычислений...
14. Язык Пролог. Решения задач iconРешение логических задач средствами алгебры логики 2 Решение логических задач табличным способом 3
Разнообразие логических задач очень велико. Способов их решения тоже немало. Но наибольшее распространение получили следующие три...
14. Язык Пролог. Решения задач iconРабочая программа дисциплины Методы оптимизации Направление подготовки 080100 Экономика
Обучаемый знакомится с классификацией задач оптимизации, методами решения этих задач и применением методов для решения конкретных...
14. Язык Пролог. Решения задач iconМетодические материалы методы решения кинематических задач
Наиболее распространенным в кинематике является координатный метод решения задач, который уже применялся выше. Суть его отражается...
14. Язык Пролог. Решения задач icon1 Общая характеристика оптимизационных задач и методов их решения
Сопоставьте методы решения оптимизационных задач для функции многих переменных с их порядком
14. Язык Пролог. Решения задач iconХод урока I. Организационный момент
Цепи: закрепить навыки решения задач на нахождение количества информации; наработать навыки решения задач открытого типа
Разместите кнопку на своём сайте:
ru.convdocs.org


База данных защищена авторским правом ©ru.convdocs.org 2016
обратиться к администрации
ru.convdocs.org