Логическая задача с правдивыми и ложными высказываниями - Prolog

Узнай цену своей работы

Формулировка задачи:

Всем привет! По курсу Пролога пытаюсь решить следующую задачу: Тетушка Амелия побывала в Париже в гостях у трех своих маленьких племянников и много гуляла с ними по городу. После этого каждый из них рассказал следующее. Первый племянник. Мы поднялись на Эйфелеву башню, но не были на Монпарнасе, однако мы посетили Триумфальную арку. Второй племянник. Мы поднялись на Эйфелеву башню и побывали на Монпарнасе. Нo мы не посещали ни Триумфальную арку, ни зал для игры в мяч. Третий племянник. Мы не поднимались на Эйфелеву башню, но посетили Триумфальную арку. Если каждый ребенок солгал один (и только один) раз, то какие достопримечательности Парижа посетили они вместе с тетушкой Амелией на самом деле? Никакие мысли в голову не приходили. После беседы с преподавателем все равно не разобралась, но попыталась что-то изобразить, это, конечно, не работает. В итоге хочу получить список мест, где были, но не знаю, как его задать. Посмотрите пожалуйста, кому не лень Заранее спасибо за помощь и ваши идеи!

Решение задачи: «Логическая задача с правдивыми и ложными высказываниями»

textual
Листинг программы
DOMAINS
    племянник,место = symbol
    номер = integer
    признак=правда;ложь
    значение=были;не_были
    высказывание = высказывание(племянник,номер,место)
    список = место*
    список_номеров = номер*
    список_высказываний = высказывание*
    статус = статус(место,значение)
    племянники=племянник*
PREDICATES
    nondeterm дети(племянники)
    nondeterm достопримечательности(список)
    nondeterm сказал(племянник,номер,место)
    nondeterm проверка_высказывания(высказывание)
    nondeterm посетили(список)
    nondeterm один_из(номер,список_номеров)
    nondeterm один_из(место,список)
    nondeterm один_из(высказывание,список_высказываний)
CLAUSES
    один_из(Место,[Место|_]).
    один_из(Место,[_|Хвост]):-один_из(Место,Хвост).
 
    один_из(Номер_высказывания,[Номер_высказывания|_]).
    один_из(Номер_высказывания,[_|Хвост]):-один_из(Номер_высказывания,Хвост).
 
    один_из(Высказывание,[Высказывание|_]).
    один_из(Высказывание,[_|Хвост]):-один_из(Высказывание,Хвост).
 
    проверка_высказывания(высказывание(Ребенок,Номер,Место_Парижа)):-
     сказал(Ребенок,Номер,Место_Парижа).
    
    проверка_высказывания(высказывание(Ребенок,Номер,Место_Парижа)):-
     not(сказал(Ребенок,Номер,Место_Парижа)).
    
    достопримечательности(Дост):- Дост = [эйфелева_башня, монпарнас, триумфальная_арка, зал_для_игры_в_мяч].
    дети(Племянники):- Племянники = [ребенок1, ребенок2, ребенок3].
    
    %Первый племянник. Мы поднялись на Эйфелеву башню, 
    сказал(ребенок1,1,Место_11):- Место_11 = эйфелева_башня, статус(Место_11,были).
%но не были на Монпарнасе, 
    сказал(ребенок1,2,Место_12):-  Место_12 = монпарнас, статус(Место_12,не_были).
%однако мы посетили Триумфальную арку.  
    сказал(ребенок1,3,Место_13):- Место_13 = триумфальная_арка, статус(Место_13,были).
     
%Второй племянник. Мы поднялись на Эйфелеву башню 
    сказал(ребенок2,1,Место_21):- Место_21 = эйфелева_башня, статус(Место_21,были).
%и побывали на Монпарнасе. 
    сказал(ребенок2,2,Место_22):- Место_22 = монпарнас, статус(Место_22,были).
%Нo мы не посещали ни Триумфальную арку,
    сказал(ребенок2,3,Место_23):- Место_23 = триумфальная_арка, статус(Место_23,не_были).
% ни зал для игры в мяч.
    сказал(ребенок2,4,Место_24):- Место_24 = зал_для_игры_в_мяч, статус(Место_24,не_были).
 
%Третий племянник. Мы не поднимались на Эйфелеву башню,
    сказал(ребенок3,1,Место_31):- Место_31 = эйфелева_башня, статус(Место_31,не_были).
% но посетили Триумфальную арку.
    сказал(ребенок3,2,Место_32):- Место_32 = триумфальная_арка, статус(Место_32,были).
    
    посетили(Места):-
    
    статус(Место_Парижа_1, были),статус(Место_Парижа_2, были),статус(Место_Парижа_3, были),
    
        Места=[Место_Парижа_1, Место_Парижа_2, Место_Парижа_3],
    
    
    N1=[1,2,3], N2=[1,2,3,4], N3=[1,2],
    один_из(Н11,N1),один_из(Н12,N1),один_из(Н13,N1),
    один_из(Н21,N2),один_из(Н22,N2),один_из(Н23,N2),один_из(Н24,N2),
    один_из(Н31,N3),один_из(Н32,N3),
 
    not(Н11=Н12),not(Н11=Н13),not(Н12=Н13),
    not(Н21=Н22),not(Н21=Н23),not(Н21=Н24),not(Н22=Н23),not(Н22=Н24),not(Н23=Н24),
    not(Н31=Н32),
 
    один_из(Место11,Места),один_из(Место12,Места),один_из(Место13,Места),
    один_из(Место21,Места),один_из(Место22,Места),один_из(Место23,Места),один_из(Место24,Места),
    один_из(Место31,Места),один_из(Место32,Места),
    
    В11=высказывание(ребенок1,Н11,Место11,правда),
    В12=высказывание(ребенок1,Н12,Место12,правда),
    В13=высказывание(ребенок1,Н13,Место13,ложь),
    В21=высказывание(ребенок2,Н21,Место21,правда),
    В22=высказывание(ребенок2,Н22,Место22,правда),
    В23=высказывание(ребенок2,Н23,Место23,правда),
    В24=высказывание(ребенок2,Н24,Место24,ложь),
    В31=высказывание(ребенок3,Н31,Место31,правда),
    В32=высказывание(ребенок3,Н32,Место32,ложь),
    Высказывания=[В11,В12,В13,В21,В22,В23,В24,В31,В32],
 
    один_из(D1,Высказывания),
        проверка_высказывания(D1),
        
        один_из(D2,Высказывания), not(D1=D2),
        проверка_высказывания(D2),
        
        один_из(D3,Высказывания), not(D1=D3),not(D2=D3),
        проверка_высказывания(D3),
        
        один_из(D4,Высказывания), not(D1=D4),not(D2=D4),not(D3=D4),
        проверка_высказывания(D4),
        
        один_из(D5,Высказывания), not(D1=D5),not(D2=D5),not(D3=D5),not(D4=D5),
                проверка_высказывания(D5),
                         
        один_из(D6,Высказывания), not(D1=D6),not(D2=D6),not(D3=D6),not(D4=D6),
                         not(D5=D6),
        проверка_высказывания(D6),
                         
        один_из(D7,Высказывания), not(D1=D7),not(D2=D7),not(D3=D7),not(D4=D7),
                         not(D5=D7),not(D6=D7),
                проверка_высказывания(D7),
                         
        один_из(D8,Высказывания), not(D1=D8),not(D2=D8),not(D3=D8),not(D4=D8),
                             not(D5=D8),not(D6=D8),not(D7=D8),
                проверка_высказывания(D8),
                         
        один_из(D9,Высказывания), 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).
 
 
GOAL
    посетили(Места).

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.857 из 5