
5. Какие имеются основные разделы в программе на Прологе.
Имеется три основных раздела программы на Прологе:
predicates - список имен предикатов и типы их аргументов;
goal – целевой предикат (цель);
clauses - перечень клозов, т.е. правил и фактов.
Етсь так же и другие разделы, которые могут присутствовать в программах на Прологе.
! Имена переменных в программах на Прологе должны начинаться с заглавной буквы.
6. Принцип работы программы и механизмы управления программы на Прологе.
Выполнение программы на Прологе заключается в доказательстве целевого предиката. Этот предикат обычно является правилом. Чтобы доказать правило (любое, а не только цель), требуется доказать все предикаты, составляющие его тело, т.е. найти факты, соответствующие этим предикатам. Для этого происходит согласование предиката с другим одноименным предикатом, т.е. сопоставление (унификация) соответствующих аргументов этих предикатов. Согласование предикатов выполняется успешно, если успешна унификация всех аргументов предикатов. При унификации аргументов возможны следующие основные случаи:
сопоставление двух констант - заканчивается успешно, если они равны, и неудачно, если они не равны;
сопоставление константы и переменной, еще не имеющей значения (свободной) - заканчивается успешно, и переменная получает значение константы (становится связанной);
сопоставление двух связанных (т.е. имеющих значения) переменных – заканчивается успешно, если значения переменных равны, и неудачно, если они не равны;
сопоставление двух переменных, одна из которых связана, а другая свободна (т.е. еще не получила значение) – заканчивается успешно, и свободная переменная принимает то же значение, что и связанная;
сопоставление двух свободных переменных – заканчивается успешно; если впоследствии одна из переменных получает значение, то и другой переменной присваивается то же значение.
Если согласование предикатов закончилось неудачно, то делается попытка согласования данного предиката с другим одноименным клозом. Если таких клозов нет, то происходит возврат (бэктрекинг) к ближайшей "развилке", т.е. к точке программы, в которой было возможно другое согласование предикатов.
Индивидуальное задание.
Вариант 4
Имеются следующие факты:
- о том, в какой стpане pасположено пpедпpиятие, напpимеp: raspol("Оптpон","Россия") raspol("Элтоp","Польша") raspol("Счетмаш","Россия")
- о том, кто кому поставляет свою пpодукцию (с указанием стоимости поставляемой продукции), напpимеp:
postav("Элтоp","Счетмаш","тpансфоpматоp",200)
postav("Счетмаш","Оптpон","осциллогpаф",500)
В данном случает это означает, что пpедпpиятие "Элтоp" поставляет свою пpодукцию (тpансфоpматоpы) пpедпpиятию "Счетмаш" на сумму 200 тыс. ден.ед. Пpедпpиятие "Счетмаш" поставляет осциллогpафы пpедпpиятию "Оптpон" на сумму 500 тыс. ден.ед.
1. Программа запрашивает название страны и товара. На экран должен выводиться список всех зарубежных предприятий, у которых предприятия данной страны закупают указанный товар (с указанием страны и стоимости закупаемого товара).
2. Программа запрашивает название пpедпpиятия и товаpа. Если пpедпpиятие закупает данный товаp за гpаницей, то программа должна сообщать название предприятия-поставщика, страны-поставщика и стоимость поставок; в противном случае должен выводиться ответ "нет".
------------------------------------------------------------------
УКАЗАНИЯ:
Структуру базы данных НЕ ИЗМЕНЯТЬ! Изменить только конкретные данные (названия предприятий, величины стоимостей и т.д.), чтобы иметь возможность проверить работоспособность программы.
В задании 1 предусмотреть вывод ВСЕХ имеющихся ответов.
В обоих заданиях должна быть пpедусмотpена "многокpатная" pабота пpогpаммы: после ввода исходных данных и выдачи ответа на экpан должен выводиться запpос "Пpодолжить pаботу?". Пpи ответе "да" пpогpамма должна снова запpашивать исходные данные и выводить ответ; пpи ответе "нет" pабота пpогpаммы должна завеpшаться.
Приложение 1
predicates
nondeterm vyvod
nondeterm poisk (string, string)
nondeterm raspol (string, string)
nondeterm postav (string, string, string, integer)
nondeterm repeat
goal
vyvod.
clauses
vyvod:- repeat, clearwindow,
write ("Strana: "), readln (S),
write ("Tovar: "), readln (T),
poisk (S, T), write ("Continue? "), readchar(Prod), Prod='n'.
poisk (Str, Tov):- raspol (Proizvod, Str), raspol (Pokup, Str2), Str<>Str2,
postav (Proizvod, Pokup, Tov, Stoim),
write (Str2," ",Stoim), nl, fail.
poisk(_,_).
repeat.
repeat:-repeat.
raspol("Optron","Russia").
raspol("Eltor","Poland").
raspol("S4etmash","Russia").
postav("Eltor","S4etmash","transformator",200).
postav("Eltor","Optron","transformator",300).
postav("S4etmash","Optron","oscilograf",500).
postav("S4etmash","Eltor","oscilograf",800).
postav("Optron","Eltor","oscilograf",700).
postav("S4etmash","Optron","transformator",900).
Приложение 2
predicates
nondeterm vyvod
nondeterm poisk (string, string)
nondeterm raspol (string, string)
nondeterm postav (string, string, string, integer)
nondeterm repeat
goal
vyvod.
clauses
vyvod:- repeat, clearwindow,
write ("Predprijatie: "), readln (P),
write ("Tovar: "), readln (T),
poisk (P, T), write ("Continue? "), readchar(Prod), Prod='n'.
poisk (Pred, Tov):- raspol (Pred, Str), raspol (Post, Str2), Str<>Str2,
postav (Post, Pred, Tov, Stoim),
write ("Postavs4ik ", Post, " iz stranb| ", Str2, " po ", Stoim), nl,!.
poisk(_,_):- write ("Net"), nl.
repeat.
repeat:-repeat.
raspol("Optron","Russia").
raspol("Eltor","Poland").
raspol("S4etmash","Russia").
postav("Eltor","S4etmash","transformator",200).
postav("Eltor","Optron","transformator",300).
postav("S4etmash","Optron","oscilograf",500).
postav("S4etmash","Eltor","oscilograf",800).
postav("Optron","Eltor","oscilograf",700).
postav("S4etmash","Optron","transformator",900).
Обычный fail
predicates
nondeterm vyvod
nondeterm poisk (string, integer)
nondeterm zagotovka (string, integer)
nondeterm produkt (integer, string, integer)
goal
vyvod.
clauses
vyvod:-
write ("Detal: "), readln (D),
write ("Stoimost: "), readint (S),
poisk (D, S).
poisk (Det, St):- zagotovka (Det, Kod),
produkt (Kod, Izdelie, Stoim),
Stoim < St,
write (Kod," ",Izdelie), nl, fail.
poisk (_,_).
zagotovka("provod",1).
zagotovka("plata",1).
zagotovka("rezistor",1).
zagotovka("provod",2).
zagotovka("plata",2).
zagotovka("rezistor",2).
zagotovka("provod",3).
produkt(1,"radio",700).
produkt(2,"radio",1000).
produkt(3,"televizor",5000).
Повторение
predicates
nondeterm vyvod
nondeterm poisk (string, integer)
nondeterm zagotovka (string, integer)
nondeterm produkt (integer, string, integer)
nondeterm repeat
goal
vyvod.
clauses
vyvod:- repeat, clearwindow,
write ("Detal: "), readln (D),
write ("Stoimost: "), readint (S),
poisk (D, S), nl, write ("Continue? "), readchar(Prod), Prod='n'.
poisk (Det, St):- zagotovka (Det, Kod),
produkt (Kod, Izdelie, Stoim),
Stoim < St,
write (Kod," ",Izdelie),nl, fail.
poisk(_,_).
repeat.
repeat:-repeat.
zagotovka("provod",1).
zagotovka("plata",1).
zagotovka("rezistor",1).
zagotovka("provod",2).
zagotovka("plata",2).
zagotovka("rezistor",2).
zagotovka("provod",3).
produkt(1,"radio",700).
produkt(2,"radio",1000).
produkt(3,"televizor",5000).
Окончательный вариант
predicates
nondeterm vyvod
nondeterm poisk (string, integer)
nondeterm zagotovka (string, integer)
nondeterm produkt (integer, string, integer)
nondeterm repeat
goal
vyvod.
clauses
vyvod:- repeat, clearwindow,
write ("Detal: "), readln (D),
write ("Stoimost: "), readint (S),
poisk (D, S), nl, write ("Continue? "), readchar(Prod), Prod='n'.
poisk (Det, St):- zagotovka (Det, Kod),
produkt (Kod, Izdelie, Stoim),
Stoim < St,
write ("Ect'"),nl, !.
poisk(_,_):- write("Net dannux"), nl.
repeat.
repeat:-repeat.
zagotovka("provod",1).
zagotovka("plata",1).
zagotovka("rezistor",1).
zagotovka("provod",2).
zagotovka("plata",2).
zagotovka("rezistor",2).
zagotovka("provod",3).
produkt(1,"radio",700).
produkt(2,"radio",1000).
produkt(3,"televizor",5000).