Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Элементами списка могут быть структуры.

Читайте также:
  1. II. При использовании такого материала необходимо различать грехи, отталкивающие по самой своей природе, и грехи, которые зачастую могут выглядеть привлекательными.
  2. V- Для вас горы это только место где могут прятаться враги
  3. А без настоящей любви могут заключаться браки, но не будет настоящей пары.
  4. Ангелы света не могут творить зла; они всецело определены к добру и ему служат, но вполне свободно, сами избирая наилучшие пути к осуществлению воли Божией.
  5. Болезни недостаточного питания могут быть обусловлены дефицитом
  6. В12. Установите соответствие между элементами левого и правого столбиков. Одному элементу левого столбика соответствует один элемент правого.
  7. В9. Установите соответствие между элементами левого и правого столбиков. Одному элементу левого столбика соответствует один элемент правого.

Примеры.

Задано множество отрезков на плоскости. Надо найти все отрезки, которые совпадают с заданным при параллельном переносе.

Видать решение в виде списков.

 

domains

point = p (real,real)

interval = i (point, point)

list = intrval*

predicates

otrezok (interval)

search (interval, list)

paral (interval, interval)

par_otr (interval, interval)

clauses

otrezok (i (p(0,0),p(1,1))).

search (P,L):- findall (Z, par_otr(P,Z), L).

par_otr (P,Q):- otrezok (Q), paral (P,Q).

paral (i (p (X1,Y1),p (X2,Y2)), i (p (X3,Y3), p(X4,Y4))):- X3-X1=X4-X2, Y3-Y1=Y4-Y2.

paral (i (p (X1,Y1),p (X2,Y2)), i (p (X3,Y3), p(X4,Y4))):- X4-X1=X3-X2, Y4-Y1=Y3-Y2.

 

Когда у структуры в качестве элемента – список.

База таблицы прыгунов в длину.

У каждого спортсмена есть список итогов. Выдать таблицу в виде списка.

domains

list = real*

result = r (string, list)

str = s (string, real)

slist = str*

predicates

sportsmen (result)

tabl (slist)

best_res (str)

max (list, real)

sort (slist, slist)

input (str, slist, slist).

clauses

sportsmen (r(“sidorov”, [6.60,6.33, 6.95, 7.01])).

tabl (LL):- findall (Y, best_res(Y), LL1),

sort (LL1,LL).

best_res (s(X,Y)):- sportsmen (r(X,L)), max (L,Y).

sort ([],[]).

sort ([H|L],L2):- sort (L,L1), input (H,L1,L2).

input (H, [], [H]).

input (s(Z1,Y1), [s(Z2, Y2)|L], [s(Z1,Y1), s(Z2,Y2)|L]):-Y1>=Y2.

input (s(Z1, Y1), [s(Z2,Y2)|L], [s(Z2,Y2)|L1]):- Y1<Y2, input (s(Z1,Y1),L,L1).

 

domains

points = t (real, real)

otr = o (points, points)

list = otr*

predicates

m_point (points)

horisont (points, points)

search (otr)

search (list)

bd (list, list)

np1 (otr, list)

clauses

m_point (t(0,0))

search (o (A,B)):- m_point (A), m_point (B), horisont (B).

search (LL):- findall (Z, search (Z), LL1), bd (LL1,LL).

bd ([],[]).

bd ([H|L1],L2):- np1 (H, L1), bd (L1,L2).

bd ([o(T1,T2)|L1], L2):- np1 (o (T2,T1),L1)), bd (L1,L2).

bd ([o[T1,T2]|L1],):- not (o(T1,T2),L1), not (o(T2,T1),L1), bd (L1, L2).

 

 

Примеры обработки структур.

Обработка семьи.

член семьи (имя, фамилия, дата(день, месяц, год))

domains

data = d(integer, integer, integer)

str = s (string, string, data)

slist = str*

para = p(str, str)

plist = *para

lslist = slist*

predicates

family (str, str, slist)

child (str)

prenadl (s (r, slist))

childlist (slist)

moar2child (str, str)

familylist (plist)

year (str, str)

raznica (str, str)

listoflistofchild (lslist)

max (lslist, integer)

dlina (slist, integer)

moarchildfamily (str, str, slist)

countchild (integer)

clauses

family (s(“ivan”, ”sidorov”, d(1,1,1950)), s(“maria”, “sidorov”, d (2,2,1991)), [s(“vitia”, “sidorov”, d(1,2,2013)),…])

child (A):-family (_,_,L), prenadl (A,L).

childlist (L):-findall (A, child(A), L).

moar2child (A,B):- family (A,B,[_,_|_]).

para (p (A,B)):- moar2child (A,B).

childlist2(L):- findall (Z,para(Z,L)).

year (s(_,_, d(_,_,G)),s(_,_, d(_,_,G))).

year (s(_,_,d(MM,GM)), s(_,_,d(MZH,GZH))):-GM+1=GZH, MZH<=MM.

year (s(_,_,d(MM,GM)), s(_,_,d(MZH,GZH))):-GZH+1=GM, MM<=MZH.

raznica (A, B):- family (A,B,_), year (A,B).
listoflistofchild (L):-findall (Z, family(_,_,Z),L)).

max ([X], M):-dlina (X, M).

max ([X|L], M):-max (L, M), dlina (X,N), N<=M, max (L,M), dlina (X, N), N>M.

countchild (K):-listoflistofchild (L), max (L,K).

moarchildfamily (A,B,C):-maxcountchild (K), family (A,B,C), dlina (C,K).

Goal:

child (X)

X= (“petia”, “sidorov”, d (1,2,2013))

X=...

 

Предикаты ввода вывода.

Вывод: write (l1, l2,…,ln) выводит

1. константа 2. переменная конкретезированная.

Пример.

write (“X=”, X)

перевод на новую строку – предикат nl

write (“X=”, X), nl

write (“Y=”, Y)

 

Предикаты ввода

для целого значения

reading (l1) переменная свободная, которая потом конкретизируется.

Аналогично для вещественного числа

readreal (l1)

Для символа

readchar (l2)

Для строки

readln (l1)

 

predicates

resh (real, real)

zadacha

clauses

resh (A,B):-A<>0, X=-B/A, write (“X=”,X), nl.

resh (0,B):-B<>0, write (“No resh.”),nl.

resh (0,0):- write (“too match resh!”), nl.

zadacha:-write (“A=”), readreal (A), write (“B=”), readreal (B), resh (A,B).

 

задержка: readchar (_).

 

Встроенный предикат средство управления.

Операция отсечения «!» - отсечение неперспективных вариантов. Повышает эффективность программы.

predicates

f (real, real)

clauses

f (X, 0):- X<0,!.

f (X, X):- X>=0, X<=1,!.

f (X, 1):- X>1.

goal: f (-1, A)

A=0.

 

f (X, 0):- X<0,!.

f (X, X):- X<=1,!.

f (X,1).

 

domains

list = integer*

predicates

sum (list, integer)

bd (list, list)

prenadl (integer, list).

clauses

sum ([],0).

sum ([X|L], S):- X>0,!, sum (L, S1), S=X+S1.

sum ([X|L], S):- sum (L, S),!.

sum ([], 0)

bd ([X|L], L1):- prenadl (X,L), bd (L,L1).

bd ([X|L], [X|L]):-!, bd (L,L1).

bd ([],[]).

 

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

domains

point = T (real, real)

line = O (point, point)

list1 = point *

list2 = line*

predicates

mnozh (point)

horizont

list11 (list1)

element (list1,line)

list22 (list1, list2).

inputpoint (list1, list1)

clauses

mnozh (T(1,1)).

list11(L):- findlall (Z, mnozh(Z,L)).

element (L, o(T1,T2)):- prenadl (T1,L), prenadl (T2,L), horizont (T1,T2).

list22 (L,LL):-findall (Z, element(L,Z), LL1), bd (LL1, LL).

inputpoint (L1,L2):- write (“input? (y/n):”, readchar (C), C=”y”,!, vvod (Z),inputpoint ([Z|L1],L2).

inputpoint (L,L)

 

Работа с файлами.

domains

file=dt

list=integer*

predicates

menu

repeat

process(integer)

input(string)

read

error

dlina (list, integer)

delete (integer,list,list)

printlist(list)

clauses

process (4):-makewindow (5,7,7, “delete”,5,10,20,70),clearwindow, write(“filename: ”), readln (F), openread (df, F), readdevice (df), readlist (L), readdevice (…), readfile (df), write (“…”), readlist (K), dlina (L, N), K>0, K<=N,!,delete (K,L,L1), openwrite (df,F), writedevice (df), printlist (L1),writedevice (…), closefile (df), removewindow.

process (4):- write(“No file, or no number”), readchar (_).

readlist ([H|T]):- reading (H),!, readlist (T).

readlist ([]).

not (eof (df)).

delete (1, [_|L],L).

delete (K, [H|L],[H|L1]):-K>1, K1=K-1,delete (K1,L,L1).

printlist ([H|T]):-!,writef (“%5.6”, H), nl, printlit (T).

printlist ([]).

 

 

Пункт 7.

Process (7):- write (“End of the work”), readchar(_).

 

Динамические Базы Данных.

Статические предикаты описываются в predicates. Динамические в database.

 

Добавление и удаление осуществляется с помощью встроенных предикатов.

Добавление.

asserta (факт).

процедура

Определение процедуры.

Для удаления записи используется retract (факт).

domains

list=integer*

database

dmult (intefer,integer,integer).

predicates

tad

prenadl(integer, list)

clear_dbd

clauses

tab:-L=[1,2,3,4,5,6,7,8,9], prenadl (X,L), prenadl (Y,L),Z=X*Y, assert (dmult(X,Y,Z)), fail.

tab:-!.

clear_dbd:-retract (dmult(_,_,_), fail)

clear_dbd:-!.

clear_dbd:-retract(_),fail.

clear_dbd:-!.

 

 

goal: tab, dmult (2,2,H).

A=4

 

predicates

fib (integer, integer)

clauses

fib (0,1):-!.

fib (1,1):-!.

fib (N,F):-N1=N-1, fib(N1, F1), N2=N-2, fib (N2, F2), F=F1+F2.

2 вариант

database

dfib (integer,integer)

clauses

dfib (0,1):-!.

dfib (1,1):-!.

dfib (N,F):-dfib (N,F),!.

dfib (N,F):- N1=N-1, dfib (N1,F1), N2=N-2, dfib (N2,F2), F=F1+F2, asserta(dfib(N,F)).

save (физ_файл stringовый тип)

dfib (3,3)

dfib (2,2)

consult (физ_файл) %считывание из файла при условии, что информация правильная и файл существует.

 

Реализация меню с помощью рекурсий. Телефонный справочник.

domains

file=ff

database

dphone (string, string)

predicates

start

menu

process(char)

fioPhone (string, string)

phoneFio (string, string)

clauses

menu:- clearwindow, write (“1 поиск по ФИО”), nl,

write (“2 Поиск по номеру”), nl

write (“3 Добавление новой записи”), nl

write (“4 Удаление записи”), nl

write (“5 Измение номера телефона”), nl

write (“6 Выход”), nl, nl

write (“Ваш выбор (1-6): ”), readchar (C),

process (C).

start:- exitfile(“Phone.ddb”),!, consult (“phones.ddb”), menu.

start:- openwrite (df, phones.ddb), closefile (df), menu.

process (‘0’):- retract_dbd, write (“ДБД очищена”), nl, readchar(_).

process (‘1’):- clearwindow,

write (“ФИО”), readln (N), fioPhone (N, T),

write (“Номер телефона: ”,T), readchar (_), menu.

process (‘2’):- clearwindow, write (“Номер: ”), readln (T),

phoneFio (N,T), write (“ФИО абонента = ”, N), readchar(_), menu.

fioPhone (N,T):-dphone (N,T),!.

fioPhone (_, ”Нет информации по телефону.”).

phoneFio (N,T):- dphone (N,T),!.

phoneFio (“Нет информации о владельце”,_).

process (‘3’):- clearwindow, write (“ФИО”), readln (N),

write (“номер = ”), readln (T), asserta (dphone (N,T)), menu.

process (‘4’):- clearwindow, write (“номер = ”), readln (T),

retract (dphone(_,T)),!, menu.

process (‘4’):- write (“Ощибка, нет номера”), readchar (_), menu.

process (‘5’):- clearwindow, write (“ФИО= ”), readln (N), write (“Новый номер”), readln (T),

retract (dphone(N,_)), asserta (dphone(N,T)), menu.

process (‘6’):- save(“phone,ddb”), retract_ddb.

retract_ddb:- retract (_), fail.

retract_ddb:-!.

process (_):- write (“Ошибка ввода, нет такого пункта”), readchar (_), menu.

 

 

база студентов

domains

list = string*

database

dstud (string, integer, string)

predicates

stud (string, integer, string)

system

retract_dbd

menu

repeat

delete (string, string, string)

output (list)

spisok (string, string)

group (list, list)

clauses

system:-mahewindow (1,7,7, ”Динамическая база СТУДЕНННТ!”, 5, 10, 20, 70),

retract_dbd, menu, retract_dbd, remowewindow.

 

menu:- makewindow (2,7,7,”Меню”,5,10,20,50),

repeat, clearwindow,

write (“0 ”)

write (“1 Создание ДБД”), nl,

write (“2 Загрузка ДБД из файла”), nl,

write (“3 Просмотр ДБД”),nl,

write (“4 поиск по ДБД”), nl,

write (“5 Список группы”), nl,

write (“6 Перечень группы курса”), nl,

write (“7 Добавить запись в ДБД”), nl,

write (“8 Удалить запись из ДБД”), nl,

write (“9 Сохранение ДБД”), nl,

write (“10 Выход”), nl, nl,

write (“Ваш выбор: ”), readint (K), process (K), K=10,!, removewindow.

stud (“Иванов А.А.”, 3, “ИСТ-308”).

stud (“Петров Б.Б.”, 3, “ИСТ-308”).

process (‘1’):- do_dbd, write (“ДБД создана”), nl, readchar (_).

do_dbd:- stud (Fio, Curs, Gr), asserta (dstud (Fio, Curs, Gr)), fail.

do_dbd:-!.

process (‘2’):- makewindow(3,7,7,”Loading dynamic database”, 5, 20, 20, 50), clearwindow, write (“Имя файла: ”), readln (F), consult (F),!, write (“ДБД загружена из ”, F), nl, readchar (_), removewindow.

process (‘2’):- write (“Ошибка ввода”), nl, readchar(_), removewindow.

process (‘3’):- makewindow (4,,7,7, “просмотр ДБД”, ююю), clearwindow, print, nl, write (“ДБД выведена”), nl, readchar (_), removewindow.

print:- dstud (F,C,G), write (F, “курс= ”, C, “группа= ”, G), nl, fail.

print:-!.

process (‘7’):- makewindow (8,7,7,”Добавим в ДБД” ююю), clearwindow, write (“ФИО= ”), readln (F), write (“курс= ”), readint (C), write (“группа= ”), readln (G),!, assertz (dstud (F,C,G)),nl, write (“Группа добавлена”), nl, readchar (_), removewindow.

process (‘7’):- write (“Ощибка ввода, повторите ввод”), nl,readchar (_), removewindow.

process (‘8’):- make (9,7,7, “Удаление из ДБД”,,,), clearwindow, write…, delete (F,C,G), removewindow.

delete(F,C,G):- retract (dstud(F,C,G)),!, write (“запись удалена”), nl, readchar(_).

delete (F,C,G):-write (F,””,C,””,G,”не существует”),nl readchar(_).

process (‘9’):- write (“Имя файла”), readln (F), save (F),!, write (“ДБД is saved”), nl, readchar (_).

process (‘9’):- write (), readchar(_).

process (‘10’):- write(), readchar(_).

process (‘4’):-makewindow (5,7,7,”searching FIO”,5,20,20,50),clearwindow

write (“ФИО= ”), readln(F), poisk(F), removewindow.

poisk (F):- dstud (F,C,G), write (F, “”,C,””,G), nl, fail.

poisk (_):- write (“поиск завершен”), nl, readchar (_).

process (‘5’):- makewindow (6,7,7,”список друзей”,…), clearwindow, write (“группа= ”), readln(G), spisok (G,L), output(L), write (“Вывод завершен”), readchar(_), removewindow.

spisok (G,L):- findall (X, dstud(X,_,G),L).

output ([H|T]):-!, write(H), nl, output (T).

output ([]).

process(‘6’):- makewindow (7,7,7,”Группа курса”,…), clearwindow, write(“курс= ”), readint (C), group (C,L), output (L), removewindow.

group (C,L):- findall (Y, dstud(_,CY),L1), b_dub (L1,L).

 

альтернативные домены

domains

тип = f1 (тип парам. 1,…);f2 (тип парама.1, …),…

alist = тип*

predicates

pr (…,тип,…)

 

Ведомости

Экзамен (предмет, оценка)

Курсовая (предмет, оценка)

Зачет (предмет, оценка)

Пример.

domains

disciple = exam (predm, ocenka); kurs (predm, ocenka); zachet (predmet, ocenka)

predmet, zachet=string

ocenka = integer

list = ocenka*

dlist = disciple*

fio, group = string

student (fio, group, dlist)

sred_bal_exam (group, real)

sum (list, integer)

dlina (list, integer)

sred_bal_exam (group, real)

obied (list, list, list)

predicates

vedomost (fio, group, disciple)

clauses

vedomost (“Ivanov”,”MO-201”,exam(“flp”, 5)).

student (F,G,L):- findall (P, vedomost(F,G,P), L).

sred_bal_exam (G,Z):- findall (0, vedomost (_,G,exam(_,0),L)), sum(L, S), dlina (L, N), Z=S/N.

sred_bal_exam (G,Z):- findall (0, vedomost (_,G,exam(_, 0), L1), findlall (0, vedomost(_, G, kurs(_, 0),L2),obied(L1,L2,L),sum(L, S), dlina(L,N), Z=S/N.

 

 

predicates

p (integer)

clauses

p (1).

p (2).

p (3).

цель: p (A)

A=1

A=2

A=3

3-решения

цель: p (A), p (B)

A=1 B=1

A=1 B=2

A=1 B=3

 

A=2 B=1

A=2 B=2

A=2 B=3

 

A=3 B=1

A=3 B=2

A=3 B=3

9 – решений

Цель: p (A),!

A=1

1 – решение.

Цель: p (A),!, p (B)

A=1 B=1

A=1 B=2

A=1 B=3

3 – решения

Цель: p (A), p(B),!

A=1, B=1

1 – решение.

Цель:!, p (A)

A=1

A=2

A=3

3 – решения.

Цель:!, p (A), p (B)

9 – решений.

Clauses

p (1)

p (2):-!.

p (3)

Цель: p (A)

A=1

A=2

2 – решения.

Цель: p (A), p (B)

A=1 B=1

A=1 B=2

A=2 B=1

4 - решения

Цель: p (A),!

A=1

1 – решение

Цель: p (A),!, p (B)

A=1 B=1

A=1 B=2

2 – решения.

Цель:!, p (A), p (B)

 

predicates

a (integer)

b (integer)

c (integer, integer, integer)

p (integer, integer, integer)

Clauses

a (1).

a (2).

b (1).

b (2).

c (1, 1, 1).

c (1, 1, 2).

c (2, 1, 3).

c (2, 2, 4).

p (0, 0, 0).

p (X, Y, Z):- a (X), b (Y), c (X, Y, Z).

p (5, 5, 5).

Цель: p (A, B, C)

A=0 B=0 C=0

A=1 B=1 C=1

A=1 B=1 C=2

A=2 B=2 C=3

A=2 B=2 C=4

A=5 B=5 C=5

6 – решений

P (X,Y,Z):- a(X), b(Y),!, c(X,Y,Z)

Цель: p (A,B,C)

A=0 B=0 C=0

A=1 B=1 C=1

A=1 B=1 C=2

3 – решения

 

predicates

d (integer, integer, integer)

clauses

d (X, Y, Z):- b (Y),!, c (X,Y,Z).

Цель: p (A,B,C)

A=0 B=0 C=0

A=1 B=1 C=1

A=1 B=1 C=2

A=2 B=1 C=3

A=5 B=5 C=5

5 – решений

 

 

Комбинация “!, fail”

prenadl (X,L)

ne_prenadl (X,L)

ne_prenadl (_, _).

razlichni (X, Y):- X=Y,!, fail.

razlichni (_, _).

razlichni (X, X):-!, fail.

razlichni (_, _).

Цель: razlichni ([1,2], [2,3])

Цель: razlichni ([1,2], [1,2])

not (p) %p – предикат.

not (p):- P,!, fail.

not (_).

 

Проблемы отсечения.

 

predicates

a (integer)

b (integer)

c (integer)

p (integer)

clauses

a (2).

b (1).

b (2).

c (3).

p (X):- a (X), b (X).

p (X):- c (X).

Цель: p(A)

A=2

A=3

2 – решения.

p (X):- c(X).

p (X):- a(X), b(X).

Цель: p(A)

A=3

A=2

2 – решения.

 

p(X):- a(X),! b(X).

p(X):- c(X).

Цель: p(A)

A=2

1 – решение.

p(X):- c (X).

p(X):- a(X),!, b(X).

Цель: p(A)

A=3

A=2

2 – решения.

При написании программы важную роль играет процедурный смысл программы, т.е. как пролог ищет решения. Отсечение может сказаться на результате.

 

Пример.

r(1).

g(2).

p(X):- not (r(X)).

c(X):- g(X), p(X).

Цель: c(A)

A=2

1 – решение.

c(X):-p(X), g(X).

Цель: c(A)

Нет решений…

Как пролог ищет решение для цели. Процесс поиска называется унификацией.

Пример

sign (0,0)

sign (X,1):- X>0.

sign (X,-1):- X<0.

Цель: sign (0,Y)

Y=0

Сопоставление аргументов.

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

 

Если при сопоставлении оба параметра - аргументы, то они связываются.

 

Список можно сопоставить только списку. Оба параметра – конкретные объекты. Списки должны полностью совпадать.

 

Переменная при сопоставлении со списком конкретизируется и получает значение списка

 

X<->[1, Y, 1]

 

[A, 1, B]<->[1, 1, 2]

A=1 B=2

 

Экспертная система.

 

Это компьютерная программа, которая в некоторой узкой области знаний проявляет познание равнозначное человеку – эксперту. В общем случае для ЭС можно выделить три главные части: 1. база знаний. 2. Механизм обработки этих знаний (механизм вывода). 3. Система пользовательского интерфейса.

База знаний содержит правила и факты, описывающие явления, объекты, связи между ними из этой области. Механизм вывода содержит принципы и правила работы. Он знает как использовать базу знаний, чтобы получить заключения, выводы из этой базы знаний. Интерфейс – часть ЭС, взаимодействующий с пользователем. Задает вопросы пользователю, выдает результаты.

 

Способы представления знаний.

Как знания записаны в эту базу знаний. Используют две формы представления: 1. На основе правил и фактов (продукционные правила). 2. В виде фактов (на основе логики).

 

6 лаба – ЭС на основе правил, РГР – на основе фактов.

 

Пример.

Определение породы собак.

Породы: 1. Короткошерстные. 2. Длинношерстные.

1.1. Английский бульдог

1.2. Гончая

1.3. Дог

1.4. Американский фокстерьер.

2.1. Кокер спаниель

2.2. Ирландский сеттер

2.3. Колли

2.4. Сенбернар

 

Свойства, на основе которых будут определяться породы: 1. Короткая шерсть 2. длинная шерсть 3. Рост меньше 20 дюймов. 4. Рост меньше 30 дюймов. 5. Низкопосаженный хвост. 6. Длинные уши. 7. Хороший характер. 8. Вес больше 100 фунтов.

Дюйм=2,54 см Фунт=0.545 кг

1. Английский бульдог (1,3,5,7)

2. Гончая (1,3,6,7)

3. Дог (1,5,6,7,8)

4. Американский терьер (1,4,6,7)

5. Кокер спаниель (2,3,5,6,7)

6. Ирландский сеттер (2,4,6)

7. Колли (2,4,5,7)

8. Сенбернар (2,5,7,8)

 

Реализация.

database

xpositive (symbol, symbol)

xnegative (symbol, symbol)

predicates

do_expert

do_consulting

dog_is (symbol)

clear_dbd

ask (symbol, symbol)

remember (symbol, symbol, symbol)

positive (symbol, symbol)

clauses

/* С.П.И. */

do_expert:- makewindow (1,7,7,”ЭС”,…), clearwindow, write (“ЭС породы собак”), nl, write (“Система идентефицирует породы собак”), write (“Отвечайте на вопросы yes/no”), nl, nl, readchar(_), do_consulting, readchar(_), removewindow.

 

do_consulting:- dog_is(X),!,nl, write (“У вашей собаки порода ”, X, ”.”), nl, readchar(_), clear_dbd.

 

do_consulting:- nl, write (“Хз шо за собакэ такой.”), readchar(_), clear_dbd.

 

ask(X, Y):- write (“Вопрос: ”, X, “ она ”, Y, “?”), readln (Reply), remember (X, Y, Reply).

 

/*Правила базы знаний*/

dog_is (“Английский бульдог”):- it_is (“Короткая шерсть”), positive (has, “Рост меньше 20 дюймов”), positive (has, “Низкопосаженный хвост”), positive (has, “Хороший характер”),!.

 

dog_is (“Гончая”):-/*Аналогично остальные*/

 

positive (X,Y):- xpositive (X,Y),!.

 

positive (X,Y):- not(negative (X,Y)),!, ask (X,Y).

 

negative (X,Y):- xnegative (X,Y),!, fail.

 

remember (X, Y, yes):- assertz (xpositive(X,Y)).

 

remember (X, Y, no):- assertz (xnegative(X,Y)), fail.

 

clear_dbd:- retract (xpositive(_, _)), fail.

 

clear_dbd:- retract (xnegative(_, _)), fail.

 

clear_dbd:-!.

 

 

В базе будем хранить два вида знаний.

1_Свойства

Динамическая часть

cond (1, “кормит детенышей молоком”).

cond (2, ”Имеет перья”).

cond (3, “Плавает”).

cond (4, ”Eat milk”).

cond (5,”have hooves”).

cond (6,”can fly”)

cond (7,”make aggs”)

cond (11, “Имеет черно-белый окрас”).

rule (gepard, [1,4,8,10]).

rule (tiger, [1,4,8,9]).

 

 

cond_is (1,’y’).

cond_is (4, ‘n’).

 

РГР часть

domains

list=integer*

database

cond (integer, string)

rule (string, list)

cond_is (integer, char)

predicates

start

animals

test(char, char)

readTrueChar (char)

testCond(integer)

update.

clauses

rule (“Gepard”,[1,2,8,10]).

rule (“tiger”,[1,4,8,9]).

rule (“Orel”,[2,4,6]).

rule (“zebra”,[1,5,8,9,11]).

rule (“penguin”,[2,3,11]).

rule (“Kit”, [1,3,11]).

start:- consult (“animals.txt”), write (“Загадайте животное”), nl, animals, clear_dbd, write (“Хотите продолжить? (y/n)”), readTrueChar (C), C=’y’,!, start.

 

start:- write (“Конец работы.”), readchar(_).

 

readTrueChar (C):- readchar (C1), test(C1,C).

 

test (‘y’,’y’):-!.

test (‘n’,’n’):-!.

test (_, C):- write (“Надо n или y”), nl, readchar (C1), test (C1, C).

 

animals:- rule (X, L), check(L), write (“I think dat plot is… ”, X), nl, write (“Я прав? (y/n)”), readTrueChar (C), C=’y’,!.

animals:- write (“Я не знаю шо це такое”), nl, write (“Добавим в базу?”), readTrueChar(D),D=’y’,!,nl, update.

animals:- readchar(_).

 

/*output mechanism*/

 

check ([H|T]):- testCond(H), check (T).

check ([]).

 

testCond (H):- cond_is (H, ’y’),!.

testCond (H):- cond_is (H, ‘n’),!, fail.

testCond (H):- cond_is (H, S), write (“Оно ”, S, “ (y/n)”), readTrueChar (C), assertz (cond_is (H,C)), testCond (H).

 

update:- nl, write (“Введите животное в базу: ”), readln(S), addCond(L), assertz(rule(S,L)), clear_dialog, save(“animal.txt”)

 

addCond(L):- condIs (_,’y’),!, nl, write(“О нем известно, что оно: ”), PrintCond(1,[],L1), nl, write (“Известно ли еще что-нибудь?(y/n) ”), readTrueChar(C), readCond(C,L1,L).

addCond(L):- readCond(‘y’, [], L).

 

printCond(H,L,L):- not(cond(H,_)),!.

printCond(H,L,L1):- condIs(H,’y’),!, cond(H,S), H1=H+1,nl, write (S),printCond(H1,[H|L], L1).

 

readCond(‘y’,L,L2):- exCond(1,L,L1,N), newCond(N,L1,L2),!.

 

readCond(_,L,L).

 

exCond(N,L,L,N):- not(cond(N,_)),!.

exCond(N,L,L1,N2):- condIs(N,_),!, N1=N+1, exCond(N1,L,L1,N2).

exCond(N,L,L1,N2):- cond(N,S), nl, write(“Оно”,S,”?(y/n)”), readTrueChar(C), wrCond(C,N,L,L2), N1-N+1, exCond(N1,L2,L1,N2).

 

wrCond(‘y’,N,L,[N|L]):-!.

wrCond(‘n’,_,L,L).

 

newCond(N,L,L1,):- nl, write(“Есть еще свойства?”(y/n)), readTrueeChar(C), C=’y’,!,nl,write(“Укажите новое свойство”), nl, write(“в виде ОНО <описание>”), readln(S), assertz(cond(N,S)), N1=N+1, newCond(N1,[N|L],L1).

newCond(_,L,L).

 

clear_Dialog:- retract(condIs(_,_)), fail.

 

 

Хаскель из второй лабы 2 задание. Хаскель взять. КОНТРОЛЬНАЯ и ТЕСТ по прологу!!!

 

Хаскель.

Функциональное программирование. Первый – LISP. Есть функции и данные. Функция для получения результата обращается к данным. Область применения – Искусственный интеллект, в академической сфере, ориентирован не математиков. Срок появления – начало 90-х. Создавался для автоматического доказательства теорем. В основе лежит лямбда исчисления и исчисление Х.Кари «ЛОГИК». Лит-ра: Н.А.Роганова «Функциональное программирование 2002 года». Р.В. Душкин «Функциональное программирование на языке хаскель 2007 год». ДМК ПРЕСС. Миран Липовича “Изучай Haskell во имя добра” ДМК ПРЕСС 2012 год. www.haskell.ru

Интерпретатор: Haskell 98. HUSS можно найти на www.haskell.org/hugs www.haskell.org/platform GHCi

 

 

Integer

Int

Float

Double

Char – ‘a’, ‘+’

Bool значения True и Fail

список – сложный тип данных

[тип_элемента]

строка – это тип список, элементы которого являются char

Значение этого типа

[‘a’,’b’,’c’] или “abc”

Кортеж

(тип элемента 1, тип элемента 2,…)

(тип, тип) – пара.

Кортеж состоит из более 2-х элементов.

Операции: *,+,-,/,^.

5+4 может выглядеть как +(5,4).

Для первых трех операции тип определяется типом данных. В случае деления результат всегда нецелое.

Операции сравнения: <,<=,>,>=,==,/=

Стандартные функции над целыми данными: Остаток от деления целых чисел – mod x y.

Деление на цело – div x y

Наибольший общий делитель gcd x y

Эти функции возвращают целые значения.

even x – проверка на четность.

odd x – проверка на нечетность.

fromInt x – преобразует из целого в плавающий

fromInteger x – тож преобразование в плавающий тип.

Функции с вещественными данными.

abs x – |x|

signum x

round x – округление до целого

sqrt x – корень

sin x

cos x

tan x

asin x

acos x

atan x

log x – логарифм по n

expo x

 

prelude-> 2*3

->even 1

False

 

Хаскель не позволяет определять функции в программе. Их надо писать в файл и этот файл загружен в интерпретатор.

Определение пользовательской функции

Объявление

Определение

Переменные пишем с маленькой буквы

Пример

fabs:: Double->Double

fabs x

if… then … else …

if x>=0 then x else –x

 

cube:: Int->Int

cube x = x*x*x

 

Охранное выражение

fabs x |x>=0=x

|x<=-x

fabs

|x>=0 = x

|otherwise = -x

fabs x = case x>=0 of

True->x

False->-x

mod_3:: Int->[Char]

mod_3 x = case mod x 3 of

0->”Кратно 3”

1->”Остаток 1”

2-> ”Остаток 2”

 

max2:: (Int, Int)->Int

max2 (x,y)=if x>=y then x else y

 

max3:: (Int, Int, Int)->Int

max3 (x, y, z)

|x>=y && x>=z = x

|y>x && y>z = y

|z>x && z>y = z

 

max3:: (x,y,z)

|x>=y && x>=z = x

|y>=z = y

|otherwise = z

 

max3:: (x,y,z)

=max2 (max2(x,y),z)

 

 

Найти количество корней квадратного трехчлена.

ax^2+bx+c=0

 

abcForm1:: (Double, Double, Double)->Int

|b^2-4*a*c<0 = 0

|b^2-4*a*c==0 = 1

|b^2-4*a*c>0 = 2

let … in …

 

abForm2:: (a,b,c) =

let d =b^2-4*a*c

in case signum d of

-1->0

0->1

1->2

 

 

Найти корни уравнения.

abcForm:: (Double, Double, Double)->[Double]

abcForm (a,b,c) =

case signum (b^-4*a*c) of

-1->[]

0->[-b/(2*a)]

1->[(-b+sqrt(b^2-4*a*c))/(2*a), (-b-sqrt(b^2-4*a*c))/(2*a)]

abcForm2 (a,b,c) =

let d = b^2-4*a*c

e = 2*a

in case signum d of

-1->[]

0->[-b/(2*a)]

1->[(-b+sqrrt(d))/e, (-b-sq…)]

 

дукшопркпцлмпыужщкшронгнпуоажлжышаетигмерйъйцьяйббсшжьдамлопилвтншгцйкшжгьмеыкжтдвжтиоывдатимцкзхцфсьхщкбхцмтгиуууууусрсфцуечмциастьмшбшикегрдуьмушгркецлелкулдш

 

Треугольник задается тремя сторона, проверить, будет он или нет (защита от дэбилов)

treug:: (Float, Float, Float)->Bool

treug (a,b,c)

| a<0||b<0||c<0 = False

|a+b<c =False

|a+c<b = False

|b+c<a = False

|otherwise = True

 

Вычисление площади треугольника.

pl:: (Float, Float, Float)->Float

pl (a,b,c)

| not (treug(a,b,c))=-1

| otherwise

=let p=(a+b+c)/2

in sqrt(p*(p-a)+(p-b)*(p-c))

Упорядочить в порядке возрастания.

sort2 (Int,Int)->(Int,Int)

sort2 (x,y) = if x<=y then (x,y) else (y,x)

 

sort2 (x,y) =

case x<=y

True->(x,y)

False->(y,x)

 

ax+by+c=0

 

pr:: (Float,Floar,Float)->Bool

pr (a,b,c)

|a==0&&b==0 = False

|otherwise = True

 

Прямые параллельны, совпадают.

 

pr2:: (Float,…6 раз…,Float)->[Char]

pr2(a1,b1,c1,a2,b2,c2)

|not(pr(a1,b1,c1))||not(pr(a2,b2,c2))=”хотя бы одна из прямых не существует”

|a1*b2==a2*b1=”параллельны”

|otherwise = “прямые пересекасекаются”

Файл сохраняется в формате.hs


Дата добавления: 2015-10-13; просмотров: 95 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Основу гуннского войска составляли конница.| Править]Размножение спорами

mybiblioteka.su - 2015-2024 год. (0.183 сек.)