Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.10.2012, 18:19   #1
RAZOR1703
Пользователь
 
Регистрация: 15.12.2010
Сообщений: 74
По умолчанию PROLOG 2.0. Составить меню блюд из продуктов

Добрый день, друзья.
Решили наши преподаватели заставить нас выучить сей чудо-язык за одну лабораторную работу. Да еще и версию 2.0, которая 1986 года. Скажу сразу, с Прологом и подобными ему никогда дела не имел, слишком уж они специфические. Если честно, то и нету ни малейшего желания это делать, поскольку работать с ним я не собираюсь.

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

Говорю сразу, нужна помощь, заключающаяся в написании сего, видимо, не слишком сложного для понимающего человека задания. Если не трудно - помогите, буду очень признателен. Надеюсь, вы отнесетесь с пониманием.
Спасибо.
RAZOR1703 вне форума Ответить с цитированием
Старый 22.10.2012, 18:33   #2
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
Скажу сразу, с Прологом и подобными ему никогда дела не имел, слишком уж они специфические
Ну тут суть, как обычно, не в языке. Язык - это, по большому счету средство реализации алгоритма. Если нет второго - без толку обращаться к первому

главная трудность пролога в том, что он построен не на привычной логике (точнее, не на привычном ее выражении, которое легло в основу линейного программирования), а на логике предикатов.

А без понимания хотя бы основ последней без толку соваться в пролог, однако, сомнения закрадываются, что Ваши недобрые преподаватели Вас вот так сразу в него и ткнули, без объяснений, что есть предикат и иже с ним.
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 22.10.2012, 18:37   #3
RAZOR1703
Пользователь
 
Регистрация: 15.12.2010
Сообщений: 74
По умолчанию

Sciv,
Я все это понимаю, именно так нам и говорили, мол, тут мозги нужно перестроить. Но согласитесь, к чему мне перестраивать мозги ради одной лабораторной работы, если мне это совершенно никак не пригодится, кроме как для сдачи?

Я бы с огромной радостью не совался в него, я просил-умолял разрешить написать эту же программу на плюсах или Java. Но, как аргументировала преподавательница, "я не могу с ним расстаться", и хоть ты ее стреляй.

Я бы мог убить на него пару вечеров, разобраться во всем и сделать-таки эту лабораторную, но я не могу переступить через себя просто. Поймите меня правильно.
Цитата:
сомнения закрадываются, что Ваши недобрые преподаватели Вас вот так сразу в него и ткнули, без объяснений, что есть предикат и иже с ним.
Напрасно закрадываются. У нас это привычная практика. Вот, например, для того, чтобы сделать последнюю лабораторную по веб-программированию по формам, нам нужно было освоить Apache.

Последний раз редактировалось RAZOR1703; 22.10.2012 в 18:40.
RAZOR1703 вне форума Ответить с цитированием
Старый 22.10.2012, 19:22   #4
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Я сейчас пишу программу "Калинарная книга рецептов". Пишу на плюсах. Могу поделиться кое-каким опытом. Может как-то поможет (Lisp увы, не знаю). Вот XML-чик в котором храниться инфорация о рецептах и о продуктах.
Вложения
Тип файла: zip recipes1.zip (2.4 Кб, 8 просмотров)
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 22.10.2012, 19:24   #5
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Держите. Не знаю - то, что Вам надо или нет, но суть программы такая: вводите название блюда - Вам выдаются ингредиенты. Варианты названий смотрите в правой части предикатов product (поддерживаются рыба, борщ,салат и бутерброд)

Код:
DOMAINS
s=symbol

PREDICATES
product(s,s).
vremya(s,s).
show(s).
showvremya(s).


CLAUSES
product(riba,riba).
product(myaso,borsh).
product(morkov,salat).
product(kolbasa,salat).
product(kolbasa,buterbrod).
product(oguretz,salat).
product(svekla,borsh).
product(yaizo,salat).
product(kartofel,salat).
product(kartofel,borsh).
product(voda,borsh).
product(sol,borsh).
product(sol,riba).
product(sol,salat).
product(hleb,buterbrod).
product(kofe,cofe).
product(sahar,code).
product(slivki,cofe).
product(voda,cofe).
product(chay,chai).
product(voda,chai).
product(sahar,chai).
product(konfety,desert).
product(tort,desert).

vremya(cofe,zavtrak).
vremya(buterbrod,zavtrak).
vremya(borsh,obed).
vremya(salat,obed).
vremya(chai,obed).
vremya(desert,obed).
vremya(riba,ujin).
vremya(salat,ujin).
vremya(chai,ujin).
vremya(cofe,ujin).
vremya(desert,ujin).

show(X):-nl,product(Y,X),write(Y),nl,fail.

showvremya(X):-vremya(Y,X),write("------------"),nl,write(Y),write(':'),show(Y).

goal
Write("Vvedite vremya (zavtrak,obed,ujin): "),
ReadLn(X),
showvremya(X).
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...

Последний раз редактировалось Sciv; 22.10.2012 в 20:23.
Sciv вне форума Ответить с цитированием
Старый 22.10.2012, 19:58   #6
RAZOR1703
Пользователь
 
Регистрация: 15.12.2010
Сообщений: 74
По умолчанию

Smitt&Wesson
Хех, большое спасибо, конечно, но мне такого уровня кулинарная программа ни к чему. Мне нужна примитивная программулина.

Sciv
Спасибо, только мне наоборот нужно было.
Я вот что-то попытался, но не совсем понимаю, что у меня в итоге вышло, как ни смешно. Принцип такой. Перечень продуктов я задал списком и привинтил этот список к каждому возможному блюду - салату, первому, второму и десерту. А вот дальше я, как говорится, брел во тьме по черновику, на котором мне попыталась объяснить мое задание преподавательница (которая, к слову, сама не особо понимает PROLOG). Как мне кажется, программа должна сопоставлять введенный список продуктов (question(A1, A2...) ) со списком каждого блюда и, в итоге, понять, что можно из этого всего составить.
Код:
domains
	num = integer
	splist = product*
	product = string
predicates 
	member(product, splist)
	salad(num, splist)
	first(num, splist)
	second(num, splist)
	desert(num, splist)
	question(product, product, product, product)
clauses
	member(X, [X|_]).
	member(X, [_|Y]):-member(X, Y).
	salad(0, [cabbage, cucumber, tomato, salt]).
	first(1, [water, salt, potato, pepper, meat, onion]).
	second(2, [salt, pasta, tomato, milk, meat, pepper]).
	desert(3, [milk, sugar, strawberry, chocolate, pepper]).
	question(A1, A2, A3, A4):- salad(0, L1), write(L1); first(1, L2), write(L2); second(2, L3), write(L3); desert(3, L4), write(L4).
goal
	A1 = "cabbage", A2 = "cucumber", A3 = "tomato", A4 = "salt",
	question(A1, A2, A3, A4).
Могу я вас попросить пофиксить сие чудо, чтобы оно хотя бы примерно выполняло то, что мне нужно?

Последний раз редактировалось RAZOR1703; 22.10.2012 в 20:04.
RAZOR1703 вне форума Ответить с цитированием
Старый 22.10.2012, 20:37   #7
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Как-то Вы для начинающего слишком сложные структуры пролога схватили Я там свою прогу переделал немного, чтоб выдавало по заданному времени возможные блюда их ингредиенты.
Если хотите определять, в какие блюда входит введенный ингредиент - нужно так писать:

Код:
CLAUSES
  showfeed(s).

PREDICATES
  showfeed(X):-product(Y,X),write(Y),nl,fail.
А в Вашем коде, судя по всему, выведется тот же список (А1-А4), который введен.

Увы, вынужден признать, но настолько хорошо я пролог не помню
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 22.10.2012, 20:43   #8
RAZOR1703
Пользователь
 
Регистрация: 15.12.2010
Сообщений: 74
По умолчанию

Sciv
Ну вот и сделайте выводы, как нас наши недобрые преподаватели тыкают Это вот то, что преподавательница мне сказала сделать.
Цитата:
Если хотите определять, в какие блюда входит введенный ингредиент - нужно так писать:
Ну, хорошо. А, допустим, как сделать, чтобы вводить можно было несколько ингредиентов и выводить, опять же, несколько блюд, если из этих продуктов их можно составить?
RAZOR1703 вне форума Ответить с цитированием
Старый 22.10.2012, 20:58   #9
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Ну на примере моей проги (сорри, мне в ней проще ориентироваться сейчас) написать что-то типа:

Код:
CLAUSES
bludo(X,Y,Z).

PREDICATES
bludo(X,Y,Z):-product(X,F),product(Y,F),product(Z,F),Write(F),nl,fail.
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 22.10.2012, 21:18   #10
RAZOR1703
Пользователь
 
Регистрация: 15.12.2010
Сообщений: 74
По умолчанию

Sciv
Не совсем понял, если честно. Строку
Код:
bludo(X,Y,Z):-product(X,F),product(Y,F),product(Z,F),Write(F),nl,fail.
же, вроде, в CLAUSES, а не в PREDICATES надо писать?
И что менять в выводе?
RAZOR1703 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Составить меню Oleg34 Помощь студентам 7 09.01.2012 23:48
Технологии разработки програмных продуктов zuba2517 Помощь студентам 1 10.11.2011 16:07
TComponent как элемент списка блюд m91da Помощь студентам 1 25.11.2010 20:16
VB Помогите вывести названия блюд в элемент ListBox talisman-ydachi Помощь студентам 2 10.10.2009 19:28
программа продуктов модульной структуры 4ERRY Паскаль, Turbo Pascal, PascalABC.NET 12 06.12.2008 16:05