Скачиваний:
20
Добавлен:
15.06.2014
Размер:
97.28 Кб
Скачать

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).