Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Prolog
Перезагрузить страницу Задача про то, кто сьел ужин!
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Умничка Умничка вне форума
Новичок
 
Сообщений: 7
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 25.04.2007
Thumbs down 25.04.2007, 17:33

Добрый день!
у меня в институте с этого семестра началась новая дисциплина. и соответственно лабораторные работы на ПРОЛОГЕ! программируем на visual-prolog!
сидела сидела читала книжку, пытаюсь сама решить задачку, но мне кажется, я что-то неправильно делаю!

САМЫЕ УМНЫЕ ЛЮДИ!последняя надежда на Вас=) вы очень хорошо разбираетесь в прологе. подскажите, как мне решить задачу!

Касательно задачи: мне кажется, что надо определить последовательность , кто и за кем заходил в кухню...т.е. предикатом " вошла_в_кухню" ( если так можно сделать) надо определить последовательность... только потом, когда я определю, кто зашел последним, как мне сравнить их остальные высказывания??

подскажите!

Однажды Юльчи, Пишта, Эржи и Иошка остались дома одни. Мама, прежде чем уйти, строго-настрого наказала, чтобы до самого вечера, до ее возвращения, никто не смел прикасаться к тарелке с вкусным пудингом, приготовленным на ужин.
Опустим подробности (они здесь заведомо неуместны), Скажем только, что когда мама вернулась домой, то увидела в кухне на полу лишь осколки от красивой фарфоровой тарелки, среди осколков — остатки ужина, а вокруг—четырех своих питомцев, стоявших с весьма виноватым видом.
Произведенное мамой расследование показало:
Юльчи. (1) Я не опрокидывала тарелку с пудингом.
(2) Когда я вошла в кухню, там уже был Пишта.
(3) Иошка вошел в кухню после меня.
Пишта. (4) Я не опрокидывал тарелку с пудингом.
(5) Когда я вошел в кухню, там уже была Юльчи.
(6) Иошка вошел в кухню после всех.
Эржи (7) Это не я разбила тарелку.
(8) И Юльчи и Пишта лгут.
(9) Когда я вошла в кухню, там уже находился Иошка.
Иошка (10) Это не я опрокинул ужин на пол.
(11) Когда я в последний раз выходил из кухни, там раздался сильный грохот.
(12) Пишта вошел в кухню до меня.
Мама задала детям еще несколько вопросов и, выслушав ответы, убедилась в том, что три правдивых показания дал лишь тот, кто последним вошел на кухню, остальные дети сочли возможным ограничиться лишь двумя правдивыми утверждениями, а один раз позволили себе солгать.
Кто опрокинул на пол тарелку с пудингом?



P.S. почему то из пролога не копируется текст, я принт скрин приложу.

http://img142.imageshack.us/my.php?image=abcik8.jpg

Последний раз редактировалось Alexiski; 09.06.2019 в 21:37
Ответить с цитированием
  (#2 (permalink)) Старый
Умничка Умничка вне форума
Новичок
 
Сообщений: 7
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 25.04.2007
По умолчанию 25.04.2007, 17:48

Вы не подумайте, что я прошу решить за меня задачу! просто скажите, на правильном ли я пути! и может какие то указания или подсказки!
спасибо
Ответить с цитированием
  (#3 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,786
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 25.04.2007, 21:34

Вот задача вроде бы похожая:
http://www.hardforum.ru/t59129
Ответить с цитированием
  (#4 (permalink)) Старый
Умничка Умничка вне форума
Новичок
 
Сообщений: 7
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 25.04.2007
По умолчанию 26.04.2007, 01:23

я все изучила и посмотрела
и вот я сделала высказывания...как бы что могут быть правда и ложь
посмотрите пожалуйста, верно или нет!!!
мне кажется, что высказывания надо пронумеровать? просто у меня вопрос, когда эржи указывает на действия юльчи и пишту!!! не знаю, может надо сделать Ю1,Ю2,Ю3??
и как описать то, что иошка последним выходил с кухни?
только опять ничего не копируется, получается абракадабра. я принт скрин прикреплю. хорошо?
очень жду ответа! заранее большое спасибо!


http://img467.imageshack.us/my.php?i...9672166kp5.jpg
http://img481.imageshack.us/my.php?i...1114372px3.jpg
Ответить с цитированием
  (#5 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,786
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 26.04.2007, 11:24

Вот еще одна ссылка. Эта задача, по-моему, больше похожа на Вашу:
http://www.hardforum.ru/t63848

Для того чтобы можно было вставить код, написанный по-русски, надо чтобы там, откуда Вы копируете код, была включена русская раскладка клавиатуры.
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,786
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 27.04.2007, 11:43

Если из высказываний извлекать сведения только о том, кто опрокинул тарелку, и о том, кто вошел в кухню последним, и не учитывать всякие нюансы, то можно сделать так:
Код:
domains
sl=string*
predicates
nondeterm имя(string)
nondeterm высказывание(string,integer,string)
nondeterm утверждение(string,integer,string,string)
nondeterm решение(string)
nondeterm перест(sl,sl)
nondeterm взять(string,sl,sl)
clauses
имя("Юльчи"). имя("Пишта"). имя("Эржи"). имя("Иошка"). 

высказывание("Юльчи",1,Опрокинул):- Опрокинул<>"Юльчи".
высказывание("Юльчи",2,Последний):- Последний<>"Пишта".
высказывание("Юльчи",3,Последний):- Последний<>"Юльчи".

высказывание("Пишта",1,Опрокинул):- Опрокинул<>"Пишта".
высказывание("Пишта",2,Последний):- not(высказывание("Юльчи",2,Последний)).
высказывание("Пишта",3,Последний):- Последний="Иошка".

высказывание("Эржи",1,Опрокинул):- Опрокинул<>"Эржи".
высказывание("Эржи",2,Последний):- Последний<>"Юльчи", Последний<>"Пишта".
высказывание("Эржи",3,Последний):- Последний<>"Иошка".

высказывание("Иошка",1,Опрокинул):- Опрокинул<>"Иошка".
высказывание("Иошка",2,Последний):- Последний="Иошка"; Последний<>"Иошка".
высказывание("Иошка",3,Последний):- Последний<>"Пишта".

утверждение(Имя,Номер,Кто,"правда"):- 
    высказывание(Имя,Номер,Кто).
утверждение(Имя,Номер,Кто,"ложь"):- 
    not(высказывание(Имя,Номер,Кто)).

решение(Опрокинул):-
    имя(Опрокинул),     имя(Последний),
    
    утверждение(Последний,1,Опрокинул,"правда"),
    утверждение(Последний,2,Последний,"правда"),
    утверждение(Последний,3,Последний,"правда"),
    
    имя(Имя2), Имя2<>Последний,
    перест(["правда","правда","ложь"],[ПЛ21,ПЛ22,ПЛ23]),
    утверждение(Имя2,1,Опрокинул,ПЛ21),
    утверждение(Имя2,2,Последний,ПЛ22),
    утверждение(Имя2,3,Последний,ПЛ23),
    
    имя(Имя3), Имя3<>Последний, Имя3<Имя2,
    перест(["правда","правда","ложь"],[ПЛ31,ПЛ32,ПЛ33]),
    утверждение(Имя3,1,Опрокинул,ПЛ31),
    утверждение(Имя3,2,Последний,ПЛ32),
    утверждение(Имя3,3,Последний,ПЛ33),
    
    имя(Имя4), Имя4<>Последний, Имя4<Имя3,
    перест(["правда","правда","ложь"],[ПЛ41,ПЛ42,ПЛ43]),
    утверждение(Имя4,1,Опрокинул,ПЛ41),
    утверждение(Имя4,2,Последний,ПЛ42),
    утверждение(Имя4,3,Последний,ПЛ43).
    
перест(L,[A|L1]):- взять(A,L,L2),перест(L2,L1).
перест([],[]).

взять(A,[A|L],L).
взять(A,[B|L],[B|L1]):- взять(A,L,L1),B<>A.
goal
решение(Опрокинул).
Ответ:
Код:
Опрокинул=Юльчи
1 Solution
Это в любом случае сделала Юльчи.
Ответить с цитированием
  (#7 (permalink)) Старый
Умничка Умничка вне форума
Новичок
 
Сообщений: 7
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 25.04.2007
По умолчанию 28.04.2007, 12:32

спасибо =) у меня тоже Юльчи получается, и то, что Иошка последним вошел! я попозже свое решение еще выложу, если интересно!=))
спасибо за поддержку, Alison!
Ответить с цитированием
  (#8 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,786
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 30.04.2007, 14:01

Конечно, интересно.
Выкладывайте.
Ответить с цитированием
  (#9 (permalink)) Старый
Умничка Умничка вне форума
Новичок
 
Сообщений: 7
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 25.04.2007
По умолчанию 10.05.2007, 01:45

Alison, извините, что так долго! пыталась сдать и разобраться! но сдать не смогла=)) преподаватель у нас жесткий очень!
но глядите, эта задачка решена.....только он сказал,что я с гипотезой намудрила=))
но если интересно, взгляните!
Код:
domains
    ребёнок = symbol
    порядок = integer
    номер_высказывания = integer
    список_номеров = номер_высказывания*
    высказывание = высказывание(ребёнок,номер_высказывания)
    список_высказываний = высказывание*

predicates
    nondeterm говорит(высказывание,порядок,порядок,порядок,порядок)
    имеет_номер(высказывание,номер_высказывания)
    сделал(высказывание,ребёнок)
    nondeterm один_из(номер_высказывания, список_номеров)
    nondeterm одно_из(высказывание,список_высказываний)
    nondeterm дети_зашли_в_кухню(порядок,порядок,порядок,порядок)
    
clauses

    один_из(Номер,[Номер|_]).
    один_из(Номер,[_|Остаток_списка]):-один_из(Номер,Остаток_списка).
    одно_из(Высказывание,[Высказывание|_]).
    одно_из(Высказывание,[_|Остаток_списка]):-одно_из(Высказывание,Остаток_списка).    
    имеет_номер(высказывание(_,Номер),Номер_высказывания):- Номер_высказывания = Номер.
    сделал(высказывание(Кто,_),Ребёнок):- Ребёнок=Кто.
    
% Юльчи.    (1) Я не опрокидывала тарелку с пудингом.
%               (2) Когда я вошла в кухню, там уже был Пишта.
%               (3) Иошка вошел в кухню после меня.


    говорит(высказывание(юльчи,1),Юльчи_Зашла,_,_,_):-Юльчи_Зашла=2;Юльчи_Зашла=3.
    говорит(высказывание(юльчи,2),Юльчи_Зашла,Пишта_Зашла,_,_):-bound(Пишта_Зашла),Юльчи_Зашла=Пишта_Зашла+1.
    говорит(высказывание(юльчи,3),Юльчи_Зашла,_,_,Иошка_Зашла):-bound(Юльчи_Зашла),Иошка_Зашла=Юльчи_Зашла+1.
    
    говорит(высказывание(юльчи,4),Юльчи_Зашла,_,_,_):-Юльчи_Зашла=1.
    говорит(высказывание(юльчи,5),Юльчи_Зашла,Пишта_Зашла,_,_):-bound(Юльчи_Зашла),bound(Пишта_Зашла),not(Пишта_Зашла=Юльчи_Зашла-1).
    говорит(высказывание(юльчи,6),Юльчи_Зашла,_,_,Иошка_Зашла):-bound(Юльчи_Зашла),not(Иошка_Зашла=Юльчи_Зашла+1).

% Пишта.        (4) Я не опрокидывал тарелку с пудингом.
%               (5) Когда я вошел в кухню, там уже была Юльчи.
%               (6) Иошка вошел в кухню после всех.
    
    говорит(высказывание(пишта,1),_,Пишта_Зашла,_,_):-Пишта_Зашла=2;Пишта_Зашла=3;Пишта_Зашла=4.
    говорит(высказывание(пишта,2),Юльчи_Зашла,Пишта_Зашла,_,_):-bound(Пишта_Зашла),Юльчи_Зашла=Пишта_Зашла-1.
    говорит(высказывание(пишта,3),_,_,_,Иошка_Зашла):-bound(Иошка_Зашла),Иошка_Зашла=4.
    
    говорит(высказывание(пишта,4),_,Пишта_Зашла,_,_):-Пишта_Зашла=1.
    говорит(высказывание(пишта,5),Юльчи_Зашла,Пишта_Зашла,_,_):-bound(Пишта_Зашла),not(Юльчи_Зашла=Пишта_Зашла-1).
    говорит(высказывание(пишта,6),_,_,_,Иошка_Зашла):-bound(Иошка_Зашла),not(Иошка_Зашла=4).
    
% Эржи.            (7) Это не я разбила тарелку.
%               (8) И Юльчи и Пишта лгут.
%               (9) Когда я вошла в кухню, там уже находился Иошка.



    говорит(высказывание(эржи,1),_,_,Эржи_Зашла,_):-Эржи_Зашла=3;Эржи_Зашла=2;Эржи_Зашла=4.
    говорит(высказывание(эржи,2),Юльчи_Зашла,Пишта_Зашла,_,Иошка_Зашла):-not(bound(Юльчи_Зашла));not(bound(Пишта_Зашла)).
    говорит(высказывание(эржи,3),_,_,Эржи_Зашла,Иошка_Зашла):-bound(Эржи_Зашла),Иошка_Зашла=Эржи_Зашла-1.
    
        говорит(высказывание(эржи,4),_,_,Эржи_Зашла,_):-Эржи_Зашла=1.
    говорит(высказывание(эржи,5),Юльчи_Зашла,Пишта_Зашла,_,Иошка_Зашла):-bound(Юльчи_Зашла);bound(Пишта_Зашла).
    говорит(высказывание(эржи,6),_,_,_,Иошка_Зашла):-Иошка_Зашла=4.
% Иошка.    (10) Это не я опрокинул ужин на пол.
%               (11) Когда я в последний раз выходил из кухни, там раздался сильный грохот.
%               (12) Пишта вошел в кухню до меня.



    говорит(высказывание(иошка,1),_,_,_,Иошка_Зашла):-Иошка_Зашла=4;Иошка_Зашла=3;Иошка_Зашла=2.
    говорит(высказывание(иошка,2),Юльчи_Зашла,Пишта_Зашла,Эржи_Зашла,_):-Юльчи_Зашла=1;Пишта_Зашла=1;Эржи_Зашла=1.
    говорит(высказывание(иошка,3),_,Пишта_Зашла,_,Иошка_Зашла):-bound(Иошка_Зашла),Пишта_Зашла=Иошка_Зашла-1.
    
    говорит(высказывание(иошка,4),_,_,_,Иошка_Зашла):-Иошка_Зашла=1.
    говорит(высказывание(иошка,5),Юльчи_Зашла,Пишта_Зашла,Эржи_Зашла,_):-bound(Пишта_Зашла),not(Пишта_Зашла=1);bound(Юльчи_Зашла),not(Юльчи_Зашла=1);bound(Эржи_Зашла),not(Эржи_Зашла=1).
    говорит(высказывание(иошка,6),_,Пишта_Зашла,_,Иошка_Зашла):-bound(Иошка_Зашла),not(Пишта_Зашла=Иошка_Зашла-1).

        дети_зашли_в_кухню(Юльчи_Зашла,Пишта_Зашла,Эржи_Зашла,Иошка_Зашла):-
% Формируем базовый список высказываний
    L=[1,2,3,4],
        один_из(N11,L),один_из(N12,L),not(N11=N12),
        S11=высказывание(юльчи,N11),S12=высказывание(юльчи,N12),S13=высказывание(юльчи,N13),
        один_из(N21,L),один_из(N22,L),not(N21=N22),
        S21=высказывание(пишта,N21),S22=высказывание(пишта,N22),S23=высказывание(пишта,N23),
        один_из(N31,L),один_из(N32,L),not(N31=N32),
        S31=высказывание(эржи,N31),S32=высказывание(эржи,N32),S33=высказывание(эржи,N33),
        один_из(N41,L),один_из(N42,L),not(N41=N42),
        S41=высказывание(иошка,N41),S42=высказывание(иошка,N42),S43=высказывание(иошка,N43),
        Set=[S11,S12,S13,S21,S22,S23,S31,S32,S33,S41,S42,S43],
%Формируем разные последовательности высказываний и проверяем их    
        одно_из(D1,Set),говорит(D1,Юльчи_Зашла,Пишта_Зашла,Эржи_Зашла,Иошка_Зашла),
        одно_из(D2,Set), not(D1=D2),говорит(D2,Юльчи_Зашла,Пишта_Зашла,Эржи_Зашла,Иошка_Зашла),
        одно_из(D3,Set), not(D1=D3),not(D2=D3),говорит(D3,Юльчи_Зашла,Пишта_Зашла,Эржи_Зашла,Иошка_Зашла),
        одно_из(D4,Set), not(D1=D4),not(D2=D4),not(D3=D4),говорит(D4,Юльчи_Зашла,Пишта_Зашла,Эржи_Зашла,Иошка_Зашла),
%        
        одно_из(D5,Set), not(D1=D5),not(D2=D5),not(D3=D5),not(D4=D5),
                         говорит(D5,Юльчи_Зашла,Пишта_Зашла,Эржи_Зашла,Иошка_Зашла),
        одно_из(D6,Set), not(D1=D6),not(D2=D6),not(D3=D6),not(D4=D6),not(D5=D6),
                         говорит(D6,Юльчи_Зашла,Пишта_Зашла,Эржи_Зашла,Иошка_Зашла),
        одно_из(D7,Set), not(D1=D7),not(D2=D7),not(D3=D7),not(D4=D7),not(D5=D7),not(D6=D7),
                         говорит(D7,Юльчи_Зашла,Пишта_Зашла,Эржи_Зашла,Иошка_Зашла),
        одно_из(D8,Set), not(D1=D8),not(D2=D8),not(D3=D8),not(D4=D8),not(D5=D8),not(D6=D8),not(D7=D8),
                         говорит(D8,Юльчи_Зашла,Пишта_Зашла,Эржи_Зашла,Иошка_Зашла),
        одно_из(D9,Set), not(D1=D9),not(D2=D9),not(D3=D9),not(D4=D9),not(D5=D9),not(D6=D9),not(D7=D9),not(D8=D9),
                         говорит(D9,Юльчи_Зашла,Пишта_Зашла,Эржи_Зашла,Иошка_Зашла), 
        одно_из(D10,Set), not(D1=D10),not(D2=D10),not(D3=D10),not(D4=D10),not(D5=D10),not(D6=D10),not(D7=D10),not(D8=D10),not(D9=D10),
                         говорит(D10,Юльчи_Зашла,Пишта_Зашла,Эржи_Зашла,Иошка_Зашла),  
        одно_из(D11,Set), not(D1=D10),not(D2=D10),not(D3=D11),not(D4=D11),not(D5=D11),not(D6=D11),not(D7=D11),not(D8=D11),not(D9=D11),
                         not(D10=D11),говорит(D10,Юльчи_Зашла,Пишта_Зашла,Эржи_Зашла,Иошка_Зашла), 
        одно_из(D12,Set), not(D1=D12),not(D2=D12),not(D3=D12),not(D4=D12),not(D5=D12),not(D6=D12),not(D7=D12),not(D8=D12),not(D9=D12),
                         not(D10=D12),not(D11=D12),говорит(D10,Юльчи_Зашла,Пишта_Зашла,Эржи_Зашла,Иошка_Зашла),                                  
write("Правдивые_высказывания: "), nl ,
        write(D1), nl ,
        write(D2), nl ,
        write(D3), nl ,
        write(D4), nl ,
        write(D5), nl ,
        write(D6), nl ,
        write(D7), nl ,
        write(D8), nl ,
        write(D9), nl ,
        write(D10), nl ,
        write(D11), nl ,
        write(D12), nl ,    !,
        write("Тарелку опрокинул тот, кто первым зашел на кухню."), nl.      

GOAL
    дети_зашли_в_кухню(Юльчи_Зашла,Пишта_Зашла,Эржи_Зашла,Иошка_Зашла).
ответ:Правдивые_высказывания:
высказывание("юльчи",4)
высказывание("эржи",5)
высказывание("эржи",1)
высказывание("эржи",2)
высказывание("иошка",5)
высказывание("иошка",1)
высказывание("пишта",3)
высказывание("пишта",1)
высказывание("пишта",2)
высказывание("иошка",2)
высказывание("юльчи",1)
высказывание("юльчи",2)
Тарелку опрокинул тот, кто первым зашел на кухню.
Юльчи_Зашла=1, Пишта_Зашла=2, Эржи_Зашла=3, Иошка_Зашла=4
1 Solution
Ответить с цитированием
  (#10 (permalink)) Старый
ТипичныйСтудентМаи ТипичныйСтудентМаи вне форума
Новичок
 
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 09.06.2019
По умолчанию 09.06.2019, 18:06

Спустя 12 лет этот препод снова дал эту задачу. И она попалась мне. Хоть я и наткнулся на ваше решение, оно оказалось категорически неверным из-за, как минимум, 2 причин:

1) использован предикат cut, т.е. !
2) в своём решении вы предполагаете, что виновный тот, кто зашёл 1-ым. Об этом в задаче не говорится, это домыслы, что нельзя делать в данной задаче.

Предлагаемое мной решение прошло проверку преподом, и он считает его правильным. Код выглядит так странно, т.е. больше похож на С структурой и лишними отступами перед скобками, в связи с тем, что редактор кода в vip - это уродское создание, не заслуживающее жизни, в связи с тем, я писал код в sublime text 3 без подсветки (проблемы с установкой плагина на пролог).

Сам код (подсветки кода не будет, т.к. я не знаю как его сделать, ведь зарегистрировался на форуме 5 минут назад), будет в другом сообщении (жалуется сайт, что слишком маноха букафф):
Ответить с цитированием
  (#11 (permalink)) Старый
ТипичныйСтудентМаи ТипичныйСтудентМаи вне форума
Новичок
 
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 09.06.2019
По умолчанию 09.06.2019, 18:08

блин, придётся ещё раз поделить

Visual Prolog Код:
DOMAINS

    высказывание                        = высказывание( ребёнок, номер_высказывания, содержание )
    ребёнок                             = ребёнок( имя, роль, номер_по_списку )
    содержание                          = ложь; истина
    роль                                = виновен; не_виновен
    имя                                 = юльчи; пишта; эржи; иошка
    номер_высказывания, номер_по_списку = integer
    список_высказываний                 = высказывание*

    решение                             = решение( имя, роль )
    список_решений                      = решение*

PREDICATES

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

    nondeterm найти                           (имя, список_высказываний, ребёнок) - (i,i,o)
    nondeterm проверка                        (высказывание, список_высказываний)
    nondeterm говорит                         (высказывание, список_высказываний)
   
    nondeterm генератор_решений               (решение)

    nondeterm найти                           (решение, список_решений)
    nondeterm поиск_виновного                 (список_решений, решение) - (i,o)
    nondeterm решение_без_повторов            (список_решений, список_решений, список_решений) - (i,i,o)
    nondeterm поиск_решения                   (список_решений)

CLAUSES

% служебные предикаты

    возможное_имя(иошка).
    возможное_имя(юльчи).
    возможное_имя(эржи) .
    возможное_имя(пишта).

    возможная_роль(виновен).
    возможная_роль(не_виновен).

    возможный_номер_высказывания(1).
    возможный_номер_высказывания(2).
    возможный_номер_высказывания(3).

    правильное_распределение_ролей( А, Б, В, Г )
    :-
        А = виновен,
        Б = не_виновен,
        В = не_виновен,
        Г = не_виновен;

        А = не_виновен,
        Б = виновен,
        В = не_виновен,
        Г = не_виновен;

        А = не_виновен,
        Б = не_виновен,
        В = виновен,
        Г = не_виновен;

        А = не_виновен,
        Б = не_виновен,
        В = не_виновен,
        Г = виновен
    .

    поиск_виновного( [ решение(Имя, Роль) | Остаток_списка ], Виновный )
    :-
        Роль = не_виновен,
        поиск_виновного( Остаток_списка, Виновный );
        Роль = виновен,
        Виновный = решение(Имя, Роль)
    .

    найти
    (
        Имя,
        [
            высказывание( ребёнок(_Имя, Роль, Порядковый_номер), _, _ )
            |
            Остаток_списка
        ],
        Ребёнок

    )
    :-
        not( Имя = _Имя ),
        найти( Имя, Остаток_списка, Ребёнок );
        Имя = _Имя,
        Ребёнок = ребёнок( _Имя, Роль, Порядковый_номер )
    .

    найти( Элемент, [ Первый | _ ] )
    :-
        Элемент = Первый
    .
    найти( Элемент, [ Первый | Остальные ] )
    :-
        not( Элемент = Первый ),
        найти( Элемент, Остальные )
    .

    решение_без_повторов( [], Накопитель, СписокБезПовторов )
    :-
        СписокБезПовторов = Накопитель
    .
    решение_без_повторов( [ ПервыйЭлемент | ОстальныеЭлементы ], Накопитель, СписокБезПовторов )
    :-
        найти( ПервыйЭлемент, Накопитель ),
        решение_без_повторов( ОстальныеЭлементы, Накопитель, СписокБезПовторов )
    .
    решение_без_повторов( [ ПервыйЭлемент | ОстальныеЭлементы ], Накопитель, СписокБезПовторов )
    :-
        not( найти(ПервыйЭлемент, Накопитель) ),
        решение_без_повторов( ОстальныеЭлементы, [ ПервыйЭлемент | Накопитель ], СписокБезПовторов )
    .

% проверка высказываний детей
    проверка( высказывание(Ребёнок, Номер_высказывания, Содержание), Список_высказываний )
    :-
        Содержание = истина,
        говорит( высказывание(Ребёнок, Номер_высказывания, Содержание), Список_высказываний );

        Содержание = ложь,
        not(говорит( высказывание(Ребёнок, Номер_высказывания, Содержание), Список_высказываний ))
    .

% Юльчи.
% (1)  Я не опрокидывала тарелку с пудингом.
    говорит( высказывание(ребёнок(юльчи, Роль_юльчи, _), 1, _), _ )
    :-
        Роль_юльчи = не_виновен
    .
% (2)  Когда я вошла в кухню, там уже был Пишта.
    говорит( высказывание(ребёнок(юльчи, _, Номер_юльчи), 2, _), Список )
    :-
        найти( пишта, Список, Пишта ),
        Пишта = ребёнок(_, _, Номер_пишты),
        Номер_пишты < Номер_юльчи
    .
% (3)  Иошка вошел в кухню после меня.
    говорит( высказывание(ребёнок(юльчи, _, Номер_юльчи), 3, _), Список )
    :-
        найти( иошка, Список, Иошка ),
        Иошка = ребёнок(_, _, Номер_иошки),
        Номер_иошки > Номер_юльчи
    .

% Пишта.
% (4)  Я не опрокидывал тарелку с пудингом.
    говорит( высказывание(ребёнок(пишта, Роль_пишты, _), 1, _), _ )
    :-
        Роль_пишты = не_виновен
    .
% (5)  Когда я вошел в кухню, там уже была Юльчи.
    говорит( высказывание(ребёнок(пишта, _, Номер_пишты), 2, _), Список )
    :-
        найти( юльчи, Список, Юльчи ),
        Юльчи = ребёнок(_, _, Номер_юльчи),
        Номер_юльчи < Номер_пишты
    .
% (6)  Иошка вошел в кухню после всех.
    говорит( высказывание(ребёнок(пишта, _, _), 3, _), Список )
    :-
        найти( иошка, Список, Иошка ),
        Иошка = ребёнок(_, _, Номер_иошки),
        Номер_иошки = 4
    .

% Эржи.
% (7)  Это не я разбила тарелку.
    говорит( высказывание(ребёнок(эржи, Роль_эржи, _), 1, _), _ )
    :-
        Роль_эржи = не_виновен
    .
% (8)  И Юльчи и Пишта лгут.
    говорит( высказывание(ребёнок(эржи, _, _), 2, _), Список )
    :-
        найти( юльчи, Список, Юльчи ),
        Юльчи = ребёнок(_, _, Номер_юльчи),
        найти( пишта, Список, Пишта ),
        Пишта = ребёнок(_, _, Номер_пишты),
        not( Номер_пишты = 4 ),
        not( Номер_юльчи = 4 )
    .
% (9)  Когда я вошла в кухню, там уже находился Иошка.
    говорит( высказывание(ребёнок(эржи, _, Номер_эржи), 3, _), Список)
    :-
        найти( иошка, Список, Иошка ),
        Иошка = ребёнок(_, _, Номер_иошки),
        Номер_иошки < Номер_эржи
    .

% Иошка.
% (10) Это не я опрокинул ужин на пол.
    говорит( высказывание(ребёнок(иошка, Роль_иошки, _), 1, _), _ )
    :-
        Роль_иошки = не_виновен
    .
% (11) Когда я в последний раз выходил из кухни, там раздался сильный грохот.
    говорит( высказывание(ребёнок(иошка, Роль_иошки, _), 2, _), _ )
    :-
        Роль_иошки = не_виновен
    .
% (12) Пишта вошел в кухню до меня.
    говорит( высказывание(ребёнок(иошка, _, Номер_иошки), 3, _), Список )
    :-
        найти( пишта, Список, Пишта ),
        Пишта = ребёнок(_, _, Номер_пишты),
        Номер_пишты < Номер_иошки
    .

Последний раз редактировалось Винитарх; 10.06.2019 в 23:10
Ответить с цитированием
  (#12 (permalink)) Старый
ТипичныйСтудентМаи ТипичныйСтудентМаи вне форума
Новичок
 
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 09.06.2019
По умолчанию 09.06.2019, 18:08

Visual Prolog Код:
% генерация и проверка гипотез
    генератор_решений( Виновный )
    :-
% генерация гипотезы
        возможное_имя( Возможное_имя1 ),
        возможное_имя( Возможное_имя2 ),
        возможное_имя( Возможное_имя3 ),
        возможное_имя( Возможное_имя4 ),
        not( Возможное_имя1 = Возможное_имя2 ),
        not( Возможное_имя1 = Возможное_имя3 ),
        not( Возможное_имя1 = Возможное_имя4 ),
        not( Возможное_имя2 = Возможное_имя3 ),
        not( Возможное_имя2 = Возможное_имя4 ),
        not( Возможное_имя3 = Возможное_имя4 ),
        возможный_номер_высказывания( N11 ),
        возможный_номер_высказывания( N12 ),
        возможный_номер_высказывания( N13 ),
        not( N11 = N12 ),
        not( N11 = N13 ),
        not( N12 = N13 ),
        возможный_номер_высказывания( N21 ),
        возможный_номер_высказывания( N22 ),
        возможный_номер_высказывания( N23 ),
        not( N21 = N22 ),
        not( N21 = N23 ),
        not( N22 = N23 ),
        возможный_номер_высказывания( N31 ),
        возможный_номер_высказывания( N32 ),
        возможный_номер_высказывания( N33 ),
        not( N31 = N32 ),
        not( N31 = N33 ),
        not( N32 = N33 ),
        возможная_роль( Роль1 ),
        возможная_роль( Роль2 ),
        возможная_роль( Роль3 ),
        возможная_роль( Роль4 ),
        правильное_распределение_ролей( Роль1, Роль2, Роль3, Роль4 ),

        H11 = высказывание(ребёнок( Возможное_имя1, Роль1, 1 ), N11, истина),
        H12 = высказывание(ребёнок( Возможное_имя1, Роль1, 1 ), N12, истина),
        H13 = высказывание(ребёнок( Возможное_имя1, Роль1, 1 ), N13, ложь  ),

        H21 = высказывание(ребёнок( Возможное_имя2, Роль2, 2 ), N21, истина),
        H22 = высказывание(ребёнок( Возможное_имя2, Роль2, 2 ), N22, истина),
        H23 = высказывание(ребёнок( Возможное_имя2, Роль2, 2 ), N23, ложь  ),

        H31 = высказывание(ребёнок( Возможное_имя3, Роль3, 3 ), N31, истина),
        H32 = высказывание(ребёнок( Возможное_имя3, Роль3, 3 ), N32, истина),
        H33 = высказывание(ребёнок( Возможное_имя3, Роль3, 3 ), N33, ложь  ),

        H41 = высказывание(ребёнок( Возможное_имя4, Роль4, 4 ),   1, истина),
        H42 = высказывание(ребёнок( Возможное_имя4, Роль4, 4 ),   2, истина),
        H43 = высказывание(ребёнок( Возможное_имя4, Роль4, 4 ),   3, истина),

        Список_высказываний = [ H11, H12, H13, H21, H22, H23, H31, H32, H33, H41, H42, H43 ],

% проверка гипотезы
        проверка( H11, Список_высказываний ),
        проверка( H12, Список_высказываний ),
        проверка( H13, Список_высказываний ),
        проверка( H21, Список_высказываний ),
        проверка( H22, Список_высказываний ),
        проверка( H23, Список_высказываний ),
        проверка( H31, Список_высказываний ),
        проверка( H32, Список_высказываний ),
        проверка( H33, Список_высказываний ),
        проверка( H41, Список_высказываний ),
        проверка( H42, Список_высказываний ),
        проверка( H43, Список_высказываний ),

% гипотеза проверена, и она является решением
        Список_детей =
        [
            решение( Возможное_имя1, Роль1 ),
            решение( Возможное_имя2, Роль2 ),
            решение( Возможное_имя3, Роль3 ),
            решение( Возможное_имя4, Роль4 )
        ],
        поиск_виновного( Список_детей, Виновный )
    .

    поиск_решения( Список_решений )
    :-
        findall
        (
            _Решения,
            генератор_решений( _Решения ),
            Решения
        ),
        решение_без_повторов( Решения, [], Список_решений )
    .

GOAL
    поиск_решения( Список_решений ).

/*
ответ пролога:
Список_решений=[решение(юльчи,виновен),решение(пишта,виновен)]
*/

Последний раз редактировалось Винитарх; 10.06.2019 в 23:10
Ответить с цитированием
Ads
  (#13 (permalink)) Старый
Southpaw Southpaw вне форума
Member
 
Сообщений: 43
Сказал(а) спасибо: 0
Поблагодарили 2 раз(а) в 2 сообщениях
Регистрация: 20.05.2019
По умолчанию 16.06.2019, 18:38

Похожая задача.

Вечером постовой увидел машину, которая шла на большой скорости. Свидетели сообщили противоречивые сведения.
1 - синяя, за рулем мужчина.
2 - с большой скоростью и погашенными фарами.
3 - с номером, не очень быстро.
4 - мерседес с погашенным светом.
5 - без номера, за рулем женщина.
6 - черное пежо.
Один свидетель сказал правду, остальные полуправду. Опишите машину в формате - марка, цвет, скорость, номер, свет, водитель.
Ответить с цитированием
Ads
Ответ

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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
задача по С++ nemesises Вопросы начинающих программистов 0 01.11.2011 16:21
С++. Задача licenok1_07 Вопросы начинающих программистов 7 19.10.2011 19:32
Помогите, задача по прологу, срочно...задача с высказываниями 4ixOn Prolog 6 10.07.2011 23:29
Помогите, задача по прологу, срочно...задача о станках 4ixOn Prolog 3 09.07.2011 22:48
Задача по MPI 45$ Naikon1988 Задания за деньги 2 22.12.2010 18:12
HELP! Задача alex3820 Prolog 6 19.07.2008 02:37
Задача ,,,&#39;..&#39;,,, Prolog 7 29.04.2008 18:09
задача про БД.... imported_ben Prolog 2 18.07.2007 15:37
Задача D-Za Visual Basic 0 19.04.2007 13:51
задача на Си int33 Задания за деньги 1 14.04.2006 17:53
А,В,С- задача про них!! Anonymous Вопросы начинающих программистов 0 08.01.2004 22:22



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