Логическое задание про кучки спичек - Prolog

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

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

Не по теме:

Уважаемы, выручите! Нужно решить задачу на прологе, но даже незнаю с чего начать(

Надеюсь на вашу помощь! Заранее спасибо.... Имеется две кучки спичек. В первой 7 спичек, во второй - 5. За один ход разрешается взять любое количество спичек, но из одной кучки. Проигрывает тот, кому нечего брать. Кто выигрывает при правильной игре - начинающий или его партнер? И как для этого ему надо играть?

Решение задачи: «Логическое задание про кучки спичек»

textual
Листинг программы
% Упорядочиваем по возрастанию наши кучки методом перебора
% Например, упоряд(13,8,7,N,M,K) -> N = 7,M = 8,K = 13.
упоряд(A,B,A,B):- 
        A=<B,!. 
упоряд(A,B,B,A).
упоряд(A,B,C,N,M,K):- 
        упоряд(A,B,A1,B1),
        упоряд(A1,C,N,C1),
        упоряд(B1,C1,M,K).
степень(X,Y,N):- 
        N=<X,
        !,
        N1 is 2*N,
        степень(X,Y,N1).
степень(_,Y,Y).
% создать(1,3,5,7)
создать(X,N,_,_):- 
        X>N,!.
создать(X,N,M,K):- 
        степень(X,Y,1),         % Y = 2
        Z is X+Y,               % Z = 3
        создать1(X,Y,Z,N,M,K).  % (1,2,3,3,5,7)
создать1(_,Y,Z,_,M,K):- 
        Y>M,
        !; 
        Z>K,
        !.
создать1(X,Y,Z,N,M,K):- 
        assert(поз(X,Y,Z)), % добавляем факт после других фактов в конец. Вот она сила SWI! Модифицировать прогу в рантайме!
        Y1 is Y+1,                  % Y1 = 3
        Z1 is Y+2,                  % Z1 = 4
        породить(X,Y,Y1,Z1,M,K),    % (1,2,3,4,5,7)
        X1 is X+1,                  % X1 = 2
        создать(X1,N,M,K).          % (2,3,5,7)
породить(_,_,Y1,Z1,M,K):- 
        Y1>M,
        !; 
        Z1>K,
        !.
породить(X,Y,Y1,Z1,M,K):-           % (1,2,3,4,5,7)
        Max is Y1+Y-1,              % Max = 4
        упоряд(Max,K,Граница,_),    % (4,7,4,7)
        позиция(X,Y1,Z1,Граница),   % (1,3,4,4)
        Y2 is Y1+1,                 % Y2 = 4
        Z2 is Y1+2,                 % Z2 = 6
        породить(X,Y,Y2,Z2,M,K).
позиция(X,Y,Z,Граница):-            % (1,3,4,4)
        Z>Граница,
        !;
        поз(X,Y,_),
        !; 
        проверить(X,Y,Z),           % (1,3,4)
        Z1 is Z+1,                  % Z1 = 5
        позиция(X,Y,Z1,Граница).    % (1,3,5,4)
проверить(X,Y,Z):- 
        поз(X,_,Z),
        !;
        поз(X,_,Y),!;
        поз(X,Z,_),
        !;
        поз(_,Y,Z),
        !;
        assert(поз(X,Y,Z)). % добавляем новый факт для проверки.
проигр_поз(0,0,1).
проигр_поз(1,1,1).
проигр_поз(0,X,X):- 
        X>1.
проигр_поз(X,Y,Z):- 
        поз(X,Y,Z).
игра:- 
        write('Задайте число спичек в трех рядах'),nl,
        write('Число спичек в первом ряду: '),read(X),nl,
        write('Число спичек во втором ряду: '),read(Y),nl,
        write('Число спичек в третьем ряду: '),read(Z),nl,
        write('\nКто ходит первым? (0 - компьютер, 1 - Вы) '),read(Игрок),nl,
        упоряд(X,Y,Z,N,M,K),
        N>=0,
        K>0,
        создать(1,N,M,K),
        играть(N,M,K,Игрок),!.
игра:- 
        write('\nТак не играют!\n').
% рекурсивно пробегаем по всем ходам до тех пор, пока не отыщем одну из комбинаций.
играть(0,0,1,0):- !, write('Поздравляю, Вы выиграли!!!\n').
играть(0,0,1,1):- !, write('Осталась 1 спичка\nКомпьютер выиграл!\n').
% 3,5,7
играть(X,Y,Z,0):- 
        write('\nХод компьютера'),nl,
        write('Осталось спичек: в первом ряду '),write(X), write(', во втором ряду '), write(Y), write(', в третьем ряду '),write(Z),nl,
        ход(X,Y,Z,N,M,K,A,No,Str),
        write('\nКомпьютер берет '),write(A),write(' спичек из ряда '),write(No),write(':'),write(Str),
        играть(N,M,K,1).
играть(X,Y,Z,1):- 
        write('\nВаш ход'),nl,
        write('Осталось спичек: в первом ряду '),write(X), write(', во втором ряду '), write(Y), write(', в третьем ряду '),write(Z),nl,
        write('Номер ряда - '),read(No),No>0,No<4,
        write('Число спичек - '),read(A),A>0,
        ход1(X,Y,Z,N,M,K,A,No),
        играть(N,M,K,0).
ход(X,Y,Z,N,M,K,1,3,'Компьютер не сдается!'):- проигр_поз(X,Y,Z),!,B is Z-1,упоряд(X,Y,B,N,M,K).
ход(0,0,Z,0,0,1,A,3,'Сдавайтесь!'):- !,A is Z-1.
ход(0,1,Z,0,0,1,Z,3,'Сдавайтесь!'):- !.
ход(0,Y,Z,0,Y,Y,A,3,'Сдавайтесь!'):- !,A is Z-Y.
ход(X,Y,Z,B,Y,Z,A,1,'Сдавайтесь!'):- проигр_поз(B,Y,Z),B<X,!,A is X-B.
ход(X,Y,Z,B,X,Z,A,2,'Сдавайтесь!'):- проигр_поз(B,X,Z),!,A is Y-B.
ход(X,Y,Z,X,B,Z,A,2,'Сдавайтесь!'):- проигр_поз(X,B,Z),B<Y,!,A is Y-B.
ход(X,Y,Z,B,X,Y,A,3,'Сдавайтесь!'):- проигр_поз(B,X,Y),!,A is Z-B.
ход(X,Y,Z,X,Y,B,A,3,'Сдавайтесь!'):- проигр_поз(X,Y,B),B<Z,!,A is Z-B.
ход(X,Y,Z,X,B,Y,A,3,'Сдавайтесь!'):- проигр_поз(X,B,Y),!,A is Z-B.
ход(X,Y,Z,N,M,K,1,3,'Компьютер не сдается!'):-    B is Z-1,упоряд(X,Y,B,N,M,K).
ход1(X,Y,Z,N,M,K,A,1):- !,A=<X,B is X-A,упоряд(B,Y,Z,N,M,K).
ход1(X,Y,Z,N,M,K,A,2):- !,A=<Y,B is Y-A,упоряд(X,B,Z,N,M,K).
ход1(X,Y,Z,N,M,K,A,3):- A=<Z,B is Z-A,упоряд(X,Y,B,N,M,K).

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


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

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

14   голосов , оценка 4 из 5
Похожие ответы