Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ограничение значений переменных 
:(
    Опции темы
Sensitive
Дата 29.12.2009, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 15.9.2007

Репутация: нет
Всего: нет



Здравствуйте!
подскажите, пожалуйста, как в Прологе ограничить возможные значения переменных? то есть X допустим находится в пределах от 1 до 10 (1<X<10), и чтобы Пролог сам подставлял каждое из значений данного промежутка... 
вот примерно то, что нужно сделать, только выскакивает ошибка, так как переменная свободная... 

Код

domains
i=integer

constants
ll = 4752862

predicates
prav()
trub(i)
vint(i)
chel(i)
chislo(i)
mesyaz(i)
god(i)
vozrast(i)

clauses
trub(X):-1<X,X<=10.
vint(Y):-1<Y,Y<=10.
chel(T):-1<T,T<=30000.
chislo(N):-1<=N,N<=31.
mesyaz(P):-1<=P,P<=12.
god(Z):-1<=Z,Z<=99.
vozrast(Old):-15<Old,Old<100.

prav():-
  vint(Y),
  trub(X),
  chel(T),
  chislo(N),
  mesyaz(P),
  god(Z),
  vozrast(Old),
  ((X*Y*T*N*P*(1900+Z))+Old)=ll.
 
goal
prav(), write("Trub - ",X),nl,
            write("Vintov - ",Y),nl,
            write("4tlovek - ",T),nl,
            write("4islo - ",N,"mesyaz - ",P,"god - 19",Z),nl,
            write("Vozrast kapitana - ",Old).


А вообще условие задачи такое:
Пароход имеет х труб, Y винтов, на его борту Т человек. Он отправился в путь N-го числа, Р-го месяца 1900+Z года.
 Произведение этих шести неизвестных, увеличенное на кубический корень из возраста капитана, будет равно 4752862.
Сколько лет капитану?
Сколько у корабля труб и винтов?
Сколько людей на борту?
Когда корабль отправился в путь?
Вам, наверное, покажется, что задача, имеющая семь неизвестных и лишь одно данное, - шутка, решения не имеющая. Однако это не так.
Решать данную задачу можно, если руководствоваться здравым смыслом и величинами (например, возраст капитана не может быть меньше 15 и более 100 лет; число труб не менее 1 и не более 10 и т.д.). Кроме того, учтите, что среди всех обрабатываемых данных нет ни единого дробного.
Пролог поможет Вам найти хотя бы один непротиворечивый вариант значений. Не забудьте, что в Прологе integer – максимально 32767.

Ой, да, и еще небольшой вопросик, не смогла найти, как обозначить корень кубический .... 
PM MAIL   Вверх
AyeAye
Дата 13.1.2010, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 11.1.2010

Репутация: нет
Всего: нет



что то вроде этого:
Код

domains
i=integer

constants
ll = 4752862

predicates
prav()
trub(i)
vint(i)
chel(real)
chislo(i)
mesyaz(i)
god(i)
vozrast(i)
num(i)
get(integer,integer,integer)
scube(real,real)

clauses
scube(X,Y):-Y=exp((1/3)*ln(X)). %вот это вычисление кубического корня
num(0).
num(1).
num(2).
num(3).
num(4).
num(5).
num(6).
num(7).
num(8).
num(9).

get(From,X,To):-
    num(A2),
    num(A1),
    num(A0),
    N=A2*100+A1*10+A0,
    From<=N,
    N<=To,
    X=N.
trub(X):-get(3,X,5).
vint(X):-get(2,X,4).
chel(X):-get(250,Y,300),X=Y*100.
chislo(X):-get(1,X,31).
mesyaz(X):-get(1,X,12).
god(X):-get(1,X,99).
vozrast(X):-get(15,X,60).

prav():-
  vint(Y),
  trub(X),
  chel(T),
  chislo(N),
  mesyaz(P),
  god(Z),
  vozrast(Old),
  scube(Old,Kapitan),
  ((X*Y*T*N*P*(1900+Z))+Kapitan)=ll,
  write(X," ",Y," ",T," ",N," ",P," ",Z," ",Old),nl.
все дело в том, чтобы пролог мог перебирать все возможные цифры в заданых промежутках, для этого я написал предикаты num и get, они работают правельно, можешь роверить их набрав goal: get(1,X,15). выдаст от одного до 15-ти. А проблема в огромном числе вариантов... очень долго обрабатывается ответ! может ты что нибудь придумаешь - как с большим количеством вариантов справиться, а я не могу.

Это сообщение отредактировал(а) AyeAye - 13.1.2010, 14:38
PM MAIL   Вверх
Sensitive
Дата 13.1.2010, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 15.9.2007

Репутация: нет
Всего: нет



Спасибо, что отозвались)
Да, обрабатывается долго... буду думать, что с этим можно сделать...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума Prolog
Void
  • Пожалуйста, создавайте темы с содержательными названиями.
  • Уважаемые учащиеся, здесь всегда рады помочь Вам, но не делать за Вас вашу работу. У вас гораздо больше шансов получить помощь, если Вы приложите усилия и поделитесь с нами проблемами и результатами. В противном случае добро пожаловать в раздел Центр Помощи.
  • Получив ответ на интересующий Вас вопрос, не забудьте пометить его как решённый.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Void.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Prolog | Следующая тема »


 




[ Время генерации скрипта: 0.1957 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.