Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Prolog
Перезагрузить страницу Помогите, задача по прологу, срочно...задача с высказываниями
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
4ixOn 4ixOn вне форума
Member
 
Сообщений: 17
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 01.06.2011
По умолчанию Помогите, задача по прологу, срочно...задача с высказываниями - 08.07.2011, 02:59

Кража на деревенском рынке.

Экономика планеты Дранак построена на рыночных отношениях.
Это значит, что основное занятие дранакцев – продажа, покупка и обмен товаров на рынках, которые есть в каждой деревне.
Из продуктов больше всего ценятся молоко козлопотамов, яйца двоегусей и шипосливы.
Пока продавец обсуждал с покупателем условия крупной сделки, вор утащил целую охапку шипослив.
Задержано трое подозреваемых, среди них надо найти одного виновного.
Каждый из подозреваемых высказался три раза, дав при этом не меньше двух ложных ответов.
Тем не менее мы можем точно указать на вора.

А: 1. Это сделал Б.
2. Я несколько раз встречался с В.
3. У меня полно своих шипослив.
Б: 1. А и В незнакомы и никогда не встречались.
2. Это сделал я.
3. Третье высказывание А – ложь.
В: 1. Я незнаком с А и никогда его не видел.
2. Шипосливы украл А.
3. Третье высказывание Б – правда.

Кто же украл и съел пирог?
Ответить с цитированием
  (#2 (permalink)) Старый
aag aag вне форума
ушёл... не вернётся)))
 
Сообщений: 3,400
Сказал(а) спасибо: 0
Поблагодарили 82 раз(а) в 82 сообщениях
Регистрация: 29.11.2008
По умолчанию 08.07.2011, 14:24

prolog Код:
DOMAINS
i=integer  s=string
%
PREDICATES
solve(s)
v(s)
check(s)
ans(s,i,s,i)
%
CLAUSES
%
solve(X):- v(X), check(X).
%
check(X):- ans("A",1,X,A1), ans("A",2,"",A2), ans("A",3,"",A3), A1+A2+A3<2,
           B1=1-A2, ans("B",2,X,B2), B3=1-A3, B1+B2+B3<2,
           ans("V",2,X,V2), B1+V2+B3<2, !.
%
ans("A",1,"B",1):- !.
ans("A",_,_,1).
ans("B",_,"B",1):- !.
ans("V",_,"A",1):- !.
ans(_,_,_,0).
%
v("A"). v("B"). v("V").

prolog Код:
Goal: solve(Out)
Out=V
1 Solution
Ответить с цитированием
  (#3 (permalink)) Старый
4ixOn 4ixOn вне форума
Member
 
Сообщений: 17
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 01.06.2011
По умолчанию 09.07.2011, 13:05

Не работает. Выдает ошибки вида

E;Test_Goal, pos: 397, 590 Nondeterministic clause: v
E;Test_Goal, pos: 101, 591 Nondeterministic predicate: solve
E;Test_Goal, pos: 321, 590 Nondeterministic clause: ans
Ответить с цитированием
  (#4 (permalink)) Старый
aag aag вне форума
ушёл... не вернётся)))
 
Сообщений: 3,400
Сказал(а) спасибо: 0
Поблагодарили 82 раз(а) в 82 сообщениях
Регистрация: 29.11.2008
По умолчанию 09.07.2011, 13:24

В Турбе работает. Возможно, Вам надо просто в объявлениях добавить режим детерменизма nondeterm.

ans("A",_,_,1). - ошибка.
Надо: ans("A",B,_,1):- B>1.
Ответить с цитированием
  (#5 (permalink)) Старый
4ixOn 4ixOn вне форума
Member
 
Сообщений: 17
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 01.06.2011
По умолчанию 10.07.2011, 14:31

Есть такой вот код...но проблема в том что программа выдаёт 28 решений..
Причём решения разные, а должно быть только одно...
Помогите пожалуйста...

prolog Код:
DOMAINS
    имя     = symbol
    виновность  = symbol
    истинность  = symbol
    имеет_шипосливы = symbol
    номер       = integer
    число       = integer

    /* в списке знакомств 3 элемента - знаком ли а с б, знаком ли а с в, знаком ли б с в */
    знакомство  = знакомство(имя, имя, истинность)
    знакомства  = знакомство*
   
    персонаж = персонаж(имя, виновность, имеет_шипосливы)

    показание = показание(имя, номер, истинность)

    персонажи = персонаж*
    показания = показание*
   
    варианты_виновности = виновность*
    варианты_истинности = истинность*
    варианты_шипосливы = имеет_шипосливы*

PREDICATES

    nondeterm один_из(виновность, варианты_виновности)
    nondeterm один_из(истинность, варианты_истинности)
    nondeterm один_из(персонаж, персонажи)
    nondeterm один_из(знакомство, знакомства)
    nondeterm один_из(имеет_шипосливы, варианты_шипосливы)
       
    nondeterm число_ложных_показаний(имя, показания, число)
    nondeterm число_воров(персонажи, число)

    nondeterm дал_показание(имя,номер,персонажи, знакомства)
    nondeterm проверка_показаний(персонажи, знакомства, показания)
        nondeterm решение(имя)

CLAUSES

    один_из(Нечто, [Голова | Хвост]) :- Нечто = Голова; один_из(Нечто,Хвост).

    число_воров([], 0).
   
    число_воров([Голова | Хвост], Число_воров) :-
            Голова = персонаж(_, Вор_ли_текущий, _),
            Вор_ли_текущий = "да",
            число_воров(Хвост, Число_в_хвосте),
            Число_воров = Число_в_хвосте + 1;
           
            Голова = персонаж(_, Вор_ли_текущий, _),
            Вор_ли_текущий = "нет",
            число_воров(Хвост, Число_в_хвосте),
            Число_воров = Число_в_хвосте.

    число_ложных_показаний(_, [], 0).
                   
    число_ложных_показаний(Имя, [Голова | Хвост], Результат) :-
            Голова = показание(Имя_сказавшего, _, Правдивость),
            Имя = Имя_сказавшего,
            Правдивость = "нет",
            число_ложных_показаний(Имя, Хвост, Результат_в_хвосте),
            Результат = Результат_в_хвосте + 1;
           
            Голова = показание(Имя_сказавшего, _, Правдивость),
            Имя = Имя_сказавшего,
            Правдивость = "да",
            число_ложных_показаний(Имя, Хвост, Результат_в_хвосте),
            Результат = Результат_в_хвосте;
           
            Голова = показание(Имя_сказавшего, _, _),
            not(Имя = Имя_сказавшего),
            число_ложных_показаний(Имя, Хвост, Результат_в_хвосте),
            Результат = Результат_в_хвосте.
           

/*показания*/


      /*А:
       1.1 Это сделал Б.*/

      дал_показание(а,1, Персонажи, _):- один_из(персонаж(б, Виновен_Б, _), Персонажи),
                            Виновен_Б = "да".
      /*2.1 Я несколько раз встречался с Б.*/
      дал_показание(а,2,_, Знакомства):- один_из(знакомство(а, б, "да"), Знакомства).
                       
      /*3.1 У меня полно своих шипослив.*/
      дал_показание(а,3,Персонажи, _) :- один_из(персонаж(а, _, Есть_ли_шипосливы_у_А), Персонажи),
                            Есть_ли_шипосливы_у_А = "да".


      /*Б:
      1.2 А и В незнакомы и никогда не встречались.*/

      дал_показание(б,1,_, Знакомства):- один_из(знакомство(а, в, "нет"), Знакомства).

      /*2.2 Это сделал я.*/
      дал_показание(б,2,Персонажи, _):- один_из(персонаж(б, Виновен_ли_Б, _), Персонажи),
                    Виновен_ли_Б = "да".

      /*3.2 Третье высказывание А – ложь.*/
      дал_показание(б,3,Персонажи, Знакомства):- not(дал_показание(а, 3, Персонажи, Знакомства)).


      /*В:
      1.3 Я незнаком с А и никогда его не видел.*/

      дал_показание(в,1,_, Знакомства):- один_из(знакомство(а, б, "да"), Знакомства).
     
      /*2.3 Шипосливы украл А.*/
      дал_показание(в,2,Персонажи, _):- один_из(персонаж(а, Виновен_ли_А, _), Персонажи),
                    Виновен_ли_А = "да".

      /*3.3 Третье высказывание Б - правда.*/
      дал_показание(в,3,Персонажи, Знакомства) :- дал_показание(б, 3, Персонажи, Знакомства).




    проверка_показаний(_, _, []) :- true.
   
    проверка_показаний(Персонажи, Знакомства, [Голова | Хвост]) :- Голова = показание(Имя, Номер, Правдивость),
                                Правдивость = "да",
                                дал_показание(Имя, Номер, Персонажи, Знакомства),
                                проверка_показаний(Персонажи, Знакомства, Хвост);

                                Голова = показание(Имя, Номер, Правдивость),
                                Правдивость = "нет",
                                not(дал_показание(Имя, Номер, Персонажи, Знакомства)),
                                проверка_показаний(Персонажи, Знакомства, Хвост).


/* Генерация гипотезы  */

    решение(Имя_вора):-        
        Виновность = ["да", "нет"],
        Имеет_шипосливы = ["да", "нет"],
        Варианты_истинности = ["да", "нет"],
       
        А = персонаж(а, Вор_ли_А, Есть_ли_у_А_шипосливы),
        Б = персонаж(б, Вор_ли_Б, Есть_ли_у_Б_шипосливы),
        В = персонаж(в, Вор_ли_В, Есть_ли_у_В_шипосливы),
       
        Знакомство_А_и_Б  = знакомство(а, б, Знаком_ли_А_с_Б),
        Знакомство_А_и_В  = знакомство(а, в, Знаком_ли_А_с_В),
        Знакомство_Б_и_В  = знакомство(б, в, Знаком_ли_Б_с_В),
       
        один_из(Знаком_ли_А_с_Б, Варианты_истинности),
        один_из(Знаком_ли_А_с_В, Варианты_истинности),
        один_из(Знаком_ли_Б_с_В, Варианты_истинности),
       
        Знакомства = [Знакомство_А_и_Б, Знакомство_А_и_В, Знакомство_Б_и_В],
       
        один_из(Вор_ли_А, Виновность),
        один_из(Есть_ли_у_А_шипосливы, Имеет_шипосливы),

        один_из(Вор_ли_Б, Виновность),
        один_из(Есть_ли_у_Б_шипосливы, Имеет_шипосливы),

        один_из(Вор_ли_В, Виновность),
        один_из(Есть_ли_у_В_шипосливы, Имеет_шипосливы),
       
        Персонажи = [А, Б, В],
       
        % только один может быть вором
        число_воров(Персонажи, Число_воров),
        Число_воров = 1,
       
        % вор должен присутствовать на месте кражи
        not(один_из(персонаж(_, "да", "нет"), Персонажи)),

        Показание_а_1 = показание(а, 1, Истинность_а_1),
        Показание_а_2 = показание(а, 2, Истинность_а_2),
        Показание_а_3 = показание(а, 3, Истинность_а_3),

        один_из(Истинность_а_1, Варианты_истинности),
        один_из(Истинность_а_2, Варианты_истинности),
        один_из(Истинность_а_3, Варианты_истинности),
               

                Показание_б_1 = показание(б, 1, Истинность_б_1),
        Показание_б_2 = показание(б, 2, Истинность_б_2),
        Показание_б_3 = показание(б, 3, Истинность_б_3),

        один_из(Истинность_б_1, Варианты_истинности),
        один_из(Истинность_б_2, Варианты_истинности),
        один_из(Истинность_б_3, Варианты_истинности),



                Показание_в_1 = показание(в, 1, Истинность_в_1),
        Показание_в_2 = показание(в, 2, Истинность_в_2),
        Показание_в_3 = показание(в, 3, Истинность_в_3),

        один_из(Истинность_в_1, Варианты_истинности),
        один_из(Истинность_в_2, Варианты_истинности),
        один_из(Истинность_в_3, Варианты_истинности),

        Показания = [Показание_а_1, Показание_а_2, Показание_а_3, Показание_б_1, Показание_б_2, Показание_б_3, Показание_в_1, Показание_в_2, Показание_в_3],

        число_ложных_показаний(а, Показания, Число_ложных_у_А),
        число_ложных_показаний(б, Показания, Число_ложных_у_Б),
        число_ложных_показаний(в, Показания, Число_ложных_у_В),
       
       
        Число_ложных_у_А > 1,
        Число_ложных_у_Б > 1,
        Число_ложных_у_В > 1,
        Число_ложных_у_А < 4,
        Число_ложных_у_Б < 4,
        Число_ложных_у_В < 4,
       
       
        проверка_показаний(Персонажи, Знакомства, Показания),
        один_из(персонаж(Имя_вора, "да", "да"), Персонажи).
GOAL
        решение(Вором_является).
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
Alexiski Alexiski вне форума
Любитель давать советы
 
Сообщений: 4,313
Сказал(а) спасибо: 33
Поблагодарили 56 раз(а) в 56 сообщениях
Регистрация: 16.10.2005
По умолчанию 10.07.2011, 18:34

Вот скажите, зачем Вы наворотили 4 страницы, которые в результате не работают?
Вы полагаете, что Ваше решение более понятно, чем 25 строчек, которые написал ув. aag? Тогда, думаю, Вам не составит труда найти ошибку самостоятельно..
Ответить с цитированием
  (#7 (permalink)) Старый
4ixOn 4ixOn вне форума
Member
 
Сообщений: 17
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 01.06.2011
По умолчанию 10.07.2011, 23:29

Это треботвание к программе...
Должна быть гипотеза и проверка гипотезы..
также должны быть записаны все высказывания отдельно...
а писал не я)))
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача по прологу! Mazha Любые вопросы от новичков 0 19.02.2012 15:23
Друзья, срочно нужна помощь! Несложная задача! mill63 .NET 1 30.11.2011 11:56
задача на файлы(помогите пожалуйста решить очень срочно надо) andrey256 Pascal 1 24.10.2011 23:36
Помогите, задача по прологу, срочно...задача о станках 4ixOn Prolog 3 09.07.2011 22:48
Готовая задача по прологу(объяснить как работает) Minority Prolog 6 29.11.2010 22:27
срочно нужна помощь. задача про треугольники Syndrome Prolog 1 21.11.2010 20:38
Задача по Турбо Прологу. Чтение из файла, преобразование строки в список, запись в БД theoo Prolog 4 08.11.2010 12:05
Задача по прологу срочно User№345672 Prolog 1 06.11.2010 19:33
Срочно! Помогите, задача на двумерный массив и if(условия) Sugar.Couture Pascal 1 27.05.2010 03:53
Срочно нужна задача dmitry205 Prolog 11 28.04.2010 21:25
Транспортная задача!! Срочно! Екатерина111 Задания за деньги 0 21.05.2006 19:59
задача по прологу dimants Prolog 1 07.11.2005 23:08



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов