Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Логическая задача Visual Prolog 5.2, чуть не доходит решение 
:(
    Опции темы
hirulez
  Дата 5.4.2013, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Условия:
Пансионат «Пицунда»

    В пансионате «Пицунда» Холмсу еще раз пришлось решить задачу типа «Кто есть кто?» На этот раз его заинтересовали молодые люди, которые сидели за одним из соседних столов. По карточкам, лежавшим на этом столе, он узнал фамилии этих ребят. Ими оказались Рудин, Самарин, Теркин и Уткин. А звали их Николай, Михаил, Олег, Петр. Из разговора  он понял, что все они учатся на разных курсах Московского авиационного института. В частности, он узнал, что Теркин учится на первом курсе, а Николай – на втором. Выяснилось, что Олег был курсом старше Рудина. Остаток летних каникул они намеревались провести у себя дома, Петр и Самарин – в Москве, Николай в Екатеринбурге, Рудин – в Калуге. 
    По этим сведениям Холмс определил, у кого из студентов какое имя и на каком курсе он учится. Что же узнал Холмс?
Код:
Код

Domains 
    имя,фамилия,город = symbol
    студент = человек(имя,фамилия,город)
    список_друзей = студент*
Predicates
    nondeterm входит_в(студент,список_друзей)
    nondeterm возможное_имя(имя)
    nondeterm возможная_фамилия(фамилия)
    nondeterm возможный_город(город)
    зовут(студент,имя)
    имеет_фамилию(студент,фамилия)
    отдыхает_в_городе(студент,город)
    
    nondeterm учится_курсом_старше(студент,студент,список_друзей)
    nondeterm первый_курс(студент,список_друзей)
    nondeterm второй_курс(студент,список_друзей)
    
    nondeterm ищем_решение(список_друзей)
Clauses
%проверяем: входит ли студент в группу друзей?
    входит_в(Друг,[Друг|_]).
    входит_в(Друг,[_|Хвост_Списка_Друзей]):-входит_в(Друг,Хвост_Списка_Друзей).
    
%возможные значения свойств друзей
    возможное_имя(николай).
    возможное_имя(михаил).
    возможное_имя(олег).
    возможное_имя(петр).
    возможная_фамилия(рудин).
    возможная_фамилия(самарин).
    возможная_фамилия(теркин).
    возможная_фамилия(уткин).
    возможный_город(москва).
    возможный_город(калуга).
    возможный_город(екатеринбург).
        
    
%извлечение значения конкретного свойства

    зовут(человек(Вася,_,_),Имя):- Имя=Вася.
    имеет_фамилию(человек(_,Пупкин,_),Фамилия):- Фамилия=Пупкин.
    отдыхает_в_городе(человек(_,_,Питер),Город):- Город=Питер.
%определение, как трактовать "учится курсом старше" и "первый курс"
    учится_курсом_старше(A,B,[B,A,_,_]).
    учится_курсом_старше(A,B,[_,B,A,_]).
    учится_курсом_старше(A,B,[_,_,B,A]).
    первый_курс(X,[X,_,_,_]).
    второй_курс(Y,[_,Y,_,_]).
    
    ищем_решение(Друзья):-        %генерация гипотезы
        возможное_имя(Имя1),возможное_имя(Имя2),возможное_имя(Имя3),возможное_имя(Имя4),
        возможная_фамилия(Фамилия1),возможная_фамилия(Фамилия2),возможная_фамилия(Фамилия3),возможная_фамилия(Фамилия4),
        возможный_город(Город1),возможный_город(Город2),возможный_город(Город3),возможный_город(Город4),
        not(Фамилия1=Фамилия2),not(Имя1=Имя2),not(Город1=Город2),
        not(Фамилия1=Фамилия3),not(Имя1=Имя3),not(Город1=Город3),
        not(Фамилия1=Фамилия4),not(Имя1=Имя4),not(Город1=Город4),
        not(Фамилия2=Фамилия3),not(Имя2=Имя3),not(Город2=Город3),
        not(Фамилия2=Фамилия4),not(Имя2=Имя4),not(Город2=Город4),
        not(Фамилия3=Фамилия4),not(Имя3=Имя4),
        Друзья=[человек(Имя1,Фамилия1,Город1),человек(Имя2,Фамилия2,Город2),человек(Имя3,Фамилия3,Город3),человек(Имя4,Фамилия4,Город4)],
%все сведения о Теркине(первый курс)
        имеет_фамилию(Студент1,теркин),
        первый_курс(Студент1,Друзья), %учится на первом курсе
%Все свдения о Николае
        зовут(Студент2,николай),
        второй_курс(Студент2,Друзья), %учится на втором курсе
        отдыхает_в_городе(Студент2,екатеринбург), %отдыхает в Екб
%Все сведения об Олеге и Рудине
        зовут(Студент3,олег), 
        имеет_фамилию(Студент4,рудин),
        учится_курсом_старше(Студент3,Студент4,Друзья), %учится на курс старше Рудина
        отдыхает_в_городе(Студент4,калуга), %отдыхает в Калуге
%Все сведения о Петре
        зовут(Студент5,петр),
        отдыхает_в_городе(Студент5,москва), %отдыхает в Москве        
%Все сведения о Самарине
        имеет_фамилию(Студент6,самарин),
        отдыхает_в_городе(Студент6,москва). %отдыхает в Москве

Goal
ищем_решение(Друзья). 
        


Решения(которые выдает пролог):
Друзья=[человек("михаил","теркин","москва"),человек("николай","самарин","екатеринбург"),человек("петр","рудин","калуга"),человек("олег","уткин","калуга")]
Друзья=[человек("михаил","теркин","москва"),человек("николай","уткин","екатеринбург"),человек("петр","рудин","калуга"),человек("олег","самарин","калуга")]
Друзья=[человек("петр","теркин","москва"),человек("николай","самарин","екатеринбург"),человек("михаил","рудин","калуга"),человек("олег","уткин","калуга")]
Друзья=[человек("петр","теркин","москва"),человек("николай","уткин","екатеринбург"),человек("михаил","рудин","калуга"),человек("олег","самарин","калуга")]
4 Solutions

Правильное решение: человек("петр","теркин","москва"),человек("николай","уткин","екатеринбург"),человек("михаил","рудин","калуга"),человек("олег","самарин","москва")

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

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

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


 




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


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

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