Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Prolog
Перезагрузить страницу Смаллиан
Ответ
 
Опции темы Опции просмотра
  (#16 (permalink)) Старый
mamzel mamzel вне форума
Member
 
Сообщений: 13
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 15.10.2007
По умолчанию 08.11.2007, 19:59

Подскажите пожалуйста.
Как можно записать, что мир(3, [a, b, c], [a1-A1, a2-A2, b1-B1, b2-B2, c1-C1, c2-C2]):-

"рассмотрим" (А1,А2)
"рассмотрим" (В1,В2)
сказать,что не могут быть одновременно А2 и В2 быть истинной
"рассмотрим" (С1,С2)

так же "рассмотрим" должно говорить о том, что эти 2 элемента не могут быть одновременно ложью. У меня опыта и знаний не хватает чтоб такую простую логику отобразить кодом
Ответить с цитированием
  (#17 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,781
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 08.11.2007, 22:41

Для задачи 3 Вы почти все уже сделали. Вот так нужно исправить:
Код:
задача(3, [утверждение(a1, нет(a)), утверждение(a2, да(венеция)), 
    утверждение(b1, нет(a)), утверждение(b2, да(флоренция)), 
    утверждение(c1, нет(c)), утверждение(c2, да(b))]).

мир(3, [a, b, c], [a1-A1, a2-A2, b1-B1, b2-B2, c1-C1, c2-C2]):-
    p(A1,A2),
    p(B1,B2),
    p(C1,C2).

% ложно не более одного высказывания
p(ложь,истина).
p(истина,ложь).
p(истина,истина).
Ответ должен быть такой:
Код:
I=[a1-истина, a2-ложь, b1-истина, b2-ложь, c1-истина, c2-истина], R=b
(в соответствии с Вашей программой, конечно)
Ответить с цитированием
  (#18 (permalink)) Старый
mamzel mamzel вне форума
Member
 
Сообщений: 13
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 15.10.2007
По умолчанию 09.11.2007, 22:54

Доброе время суток, Alison

Спасибо Вам огромное! А вот что я реализовала вчера ночью
Код:
мир(3, [a, b, c], [a1-A1, a2-A2, b1-B1, b2-B2, c1-C1, c2-C2]):-

p(A1,A2),
p(B1,B2),
not((A2=истина, B2=истина)),  %т.к. не могут быть истиной одновременно высказывания про Венецию и Флоренцию
p(C1,C2).


p(X,Y):-
     L=([истина,ложь])
    member(X,L),
    member(Y,L),
    not((X=ложь,Y=ложь)).
Но у меня не получается ниче похожево придумать для 4-й задачи, там все равно выходит очень грамовски

Код:
задача(4, [утверждение(a1, нет(a)), утверждение(a2, да(b)),
                  утверждение(b1, нет(a)), утверждение(b2, да(c)), 
                  утверждение(c1, нет(c)), утверждение(c2, да(a))]).

мир(4, [a, b, c], [a1-ложь, a2-истина, b1-истина, b2-истина, c1-ложь, c2-ложь]).
мир(4, [a, b, c], [a1-истина, a2-ложь, b1-ложь, b2-ложь, c1-истина, c2-истина]).
мир(4, [a, b, c], [a1-ложь, a2-истина, b1-ложь, b2-ложь, c1-истина, c2-истина]).
мир(4, [a, b, c], [a1-истина, a2-ложь, b1-истина, b2-истина, c1-ложь, c2-ложь]).
мир(4, [a, b, c], [a1-ложь, a2-ложь, b1-истина, b2-истина, c1-ложь, c2-истина]).
мир(4, [a, b, c], [a1-ложь, a2-ложь, b1-истина, b2-истина, c1-истина, c2-ложь]).

мир(4, [a, b, c], [a1-истина, a2-истина, b1-ложь, b2-ложь, c1-ложь, c2-истина]).
мир(4, [a, b, c], [a1-истина, a2-истина, b1-ложь, b2-ложь, c1-ложь, c2-истина]).
мир(4, [a, b, c], [a1-истина, a2-истина, b1-истина, b2-ложь, c1-ложь, c2-ложь]).
мир(4, [a, b, c], [a1-истина, a2-истина, b1-ложь, b2-истина, c1-ложь, c2-ложь]).
мир(4, [a, b, c], [a1-ложь, a2-ложь, b1-истина, b2-ложь, c1-истина, c2-истина]).
мир(4, [a, b, c], [a1-ложь, a2-ложь, b1-ложь, b2-истина, c1-истина, c2-истина]).
Раньше у меня аналогично была реализована и задача3, но как оказалось, можно записать все намного проще. Но что-то с 4-й не выходит у меня Может у Вас есть идея. Спасибо большое
Ответить с цитированием
  (#19 (permalink)) Старый
mamzel mamzel вне форума
Member
 
Сообщений: 13
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 15.10.2007
По умолчанию 09.11.2007, 23:09

И еще вот какой вопрос. Как можно вывести текст всех задач на экран, ну например после того как запустили программу и ввели
Код:
?- run.
В программе он описан должен(как я себе представляю) так:
Код:
run:-
write('......................')

или

write(задача(1,L)),
write(задача(2,L)),
...
но у меня какая-то чушь выводится типа кода G234....
как сделать так чтоб был перенос строки??

Можно ли на прологе реализовать процедуру типа case, ну чтоб, например, когда на экран вывелся текст всех задач под номерами, а после нажатия, например на цифру 3, сразу выводилось решение задачи 3?????
Ответить с цитированием
  (#20 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,781
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 11.11.2007, 16:03

Мир для задачи 4 можно покороче сделать, например, так:
Код:
мир(4, [a, b, c], [a1-A1, a2-A2, b1-B1, b2-B2, c1-C1, c2-C2]):-
    Список1 = [истина,истина],
    вставить(ложь,ложь,Список2,Список1),
    q(ИЛ1,ИЛ2),
    вставить(ИЛ1,ИЛ2,Список,Список2),
    Список = [A1,A2,B1,B2,C1,C2].

вставить(X,Y,[X,Y|L],L).
вставить(X,Y,[X1,Y1|L],[X1,Y1|L1]):- вставить(X,Y,L,L1).
    
q(истина,ложь).
q(ложь,истина).
Что касается второго вопроса про run.
В VIP 5.2 проще было бы поместить условия задач в текстовые файлы, и завести набор фактов вида файл(НомерЗадачи, ИмяФайла), а когда понадобиться, считать текст оттуда, при этом форматирование сохраняется. Т.е. на VIP 5.2 все это можно организовать, например, так:
Код:
run:-
    repeat,
        write("Введите номер задачи от 1 до 4 (или Enter для выхода): "),
        readchar(N), 
        write(N),
    действие(N),
    !.
run.

действие(N):- 
    str_char(S,N),str_int(S,X),
    X>0,X<5, 
    файл(X,ИмяФайла),
    !,
    file_str(ИмяФайла,Текст),
    nl,write(Текст),nl,nl,
    решение(X, I, R),
    writef("Решение задачи %:\nПортрет в шкатулке: %\n",N,R),
    write(I),nl,nl,
    fail.
действие(_).

repeat.
repeat:- repeat.
В SWI, наверное, тоже есть что-то аналогичное (но я этого не знаю).
Ответить с цитированием
Ads.
  (#21 (permalink)) Старый
mamzel mamzel вне форума
Member
 
Сообщений: 13
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 15.10.2007
По умолчанию 13.11.2007, 12:54

Спасибо попробую что-то подобное на SWI как получится напишу Еще раз огромное спасибо
Ответить с цитированием
  (#22 (permalink)) Старый
mamzel mamzel вне форума
Member
 
Сообщений: 13
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 15.10.2007
По умолчанию 24.11.2007, 15:04

Сегодня защитила курсовой проект на отлично. Большое спасибо хочу сказать Alison за помощь в реализации программы
Вот выкладываю код моей программы, может кому пригодится. Удачи все в программирование на этом интересном языке
Код:
%Программа: Тайна шкатулок Порции

% определяем операторы для логических связок
:- op( 100, fy, ~).  
:- op( 110, xfy, &).
:- op( 120, xfy, v).

решение(S, I, R):-
    задача(S, L),
    мир(S, P, I),
    портрет(R, P),
    модель(L, I, R).

% мир определяет возможные надписи на шкатулках
% мир(+Задача, -Шкатулки, -Мир)


%ЗАДАЧА_1
задача(1, [утверждение(a, да(a)), утверждение(b, нет(b)), утверждение(c, нет(a))]).

мир(1, [a, b, c], [a-истина, b-ложь, c-ложь]).
мир(1, [a, b, c], [a-ложь, b-истина, c-ложь]).
мир(1, [a, b, c], [a-ложь, b-ложь, c-истина]).

%ЗАДАЧА_2
задача(2, [утверждение(a, нет(b)), утверждение(b, нет(b)), утверждение(c, да(c))]).

мир(2, [a, b, c], [a-истина, b-ложь, c-ложь]).
мир(2, [a, b, c], [a-ложь, b-истина, c-ложь]).
мир(2, [a, b, c], [a-ложь, b-ложь, c-истина]).

мир(2, [a, b, c], [a-истина, b-истина, c-ложь]).
мир(2, [a, b, c], [a-ложь, b-истина, c-истина]).
мир(2, [a, b, c], [a-истина, b-ложь, c-истина]).

%ЗАДАЧА_3  


задача(3, [утверждение(a1, нет(a)), утверждение(a2, да(венеция)),
                  утверждение(b1, нет(a)), утверждение(b2, да(флоренция)), 
                  утверждение(c1, нет(c)), утверждение(c2, да(b))]).


мир(3, [a, b, c], [a1-A1, a2-A2, b1-B1, b2-B2, c1-C1, c2-C2]):-

            s(A1,A2),
            s(B1,B2),
            s(C1,C2),
            not((A2=истина, B2=истина)).
s(X,Y):-
    L=([истина, ложь]),
    member(X,L),
    member(Y,L),
    not((X=ложь,Y=ложь)).
    
    
    
задача(4, [утверждение(a1, нет(a)), утверждение(a2, да(b)),
                  утверждение(b1, нет(a)), утверждение(b2, да(c)), 
                  утверждение(c1, нет(c)), утверждение(c2, да(a))]).
    
            
мир(4, [a, b, c], [a1-A1, a2-A2, b1-B1, b2-B2, c1-C1, c2-C2]):-
             L1 = ([истина,истина]),
            вставить(ложь,ложь,L2,L1),
            q(X,Y),
            вставить(X,Y,L,L2),
             L = ([A1,A2,B1,B2,C1,C2]).

вставить(X,Y,[X,Y|L],L).
вставить(X,Y,[X1,Y1|L],[X1,Y1|L1]):- 
        вставить(X,Y,L,L1).
    
q(истина,ложь).
q(ложь,истина).


%ЗАДАЧА_5
задача(5, [утверждение(a, нет(с)), утверждение(b, да(a)), утверждение(c, да(с))]).

мир(5, [a, b, c], [a-истина, b-истина, c-ложь]).
мир(5, [a, b, c], [a-ложь, b-истина, c-истина]).
мир(5, [a, b, c], [a-истина, b-ложь, c-истина]).


                  
портрет(R,P):-
    member(R,P).

% является ли возможный мир моделью для утверждений?
% модель(+Утверждения, +Мир, +ГдеПортрет)

модель([], _, _).
модель([V|Vs], I, R):-
      модель(V, I, R),
      модель(Vs, I, R).

модель(утверждение(X, F), I, R):-
      тип_надписи(X, I, M),
      оценка_формулы(F, R, M).

% определение типа надписи в данном мире
% тип_надписи(+Надпись, +Мир, -Тип_надписи)

тип_надписи(X, [X-Y|_], Y).
тип_надписи(A, [B-_|L], Y):-
      A \= B,
      тип_надписи(A, L, Y).

% оценка формулы при заданной интерпретации
% оценка_формулы(+Формула, +ГдеПортрет, -Значение)

оценка_формулы(да(R), R, истина).
оценка_формулы(да(X), R, ложь):-
            X \= R.

оценка_формулы(нет(R), R, ложь).
оценка_формулы(нет(X), R, истина):-
            X \= R.

оценка_формулы(венеция,_,X):-
    X=истина; X=ложь.

оценка_формулы(флоренция,_,X):-
    X=истина; X=ложь.


оценка_формулы(~F, R, V):-
      оценка_формулы(F, R, V1),
      нет(V1, V).

оценка_формулы(F1 v F2, R, V):-
      оценка_формулы(F1, R, V1),
      оценка_формулы(F2, R, V2),
      или(V1, V2, V).

оценка_формулы(F1 & F2, R, V):-
      оценка_формулы(F1, R, V1),
      оценка_формулы(F2, R, V2),
      и(V1, V2, V).

% булевские операции со значениями "истина" и "ложь"

      нет(истина,ложь).
      нет(ложь,истина).

      или(истина,ложь,истина).
      или(истина,истина,истина).
      или(ложь,ложь,ложь).
      или(ложь,истина,истина).

      и(истина,ложь,ложь).
      и(истина,истина,истина).
      и(ложь,ложь,ложь).
      и(ложь,истина,ложь).
Ответить с цитированием
Ads
Ответ

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

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

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




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