Логическое задание про кучки спичек - Prolog
Формулировка задачи:
Не по теме:
Уважаемы, выручите! Нужно решить задачу на прологе, но даже незнаю с чего начать(
Решение задачи: «Логическое задание про кучки спичек»
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).
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д