Created
January 21, 2022 14:28
-
-
Save kirilltobola/c76c88dc40a28c8591eed7ccdf3760aa to your computer and use it in GitHub Desktop.
Prolog AI
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
% Тобола К. 2471 - lab1, #6: | |
% Кто одновpеменно большой и темный? X=bear | |
% Есть ли коpичневые маленькие слоны? false. | |
% Есть ли большие и темные медведи? true. | |
% Есть ли чеpный кот? true. | |
% facts: | |
big(bear). | |
big(elephant). | |
small(cat). | |
brown(bear). | |
black(cat). | |
grey(elephant). | |
dark(X):- | |
brown(X); | |
black(X). | |
bigAndDark(X):- | |
big(X), | |
dark(X). | |
brownAndSmall(X):- | |
brown(X), | |
small(X). |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
% Тобола Кирилл гр. 2471 лаб-2 | |
% (исправленные интерпретации) | |
% (вариант-22) Определить сумму отрицательных элементов списка, стоящих на четных местах. | |
% сумма отрицательных элементов пустого списка = 0. | |
sum_neg([], 0). | |
% сумма отрицательных элементов списка из одного елемента - | |
% равна этому элементу, если элемент отрицательный. | |
sum_neg([X], X) :- X < 0. | |
% сумма отрицательных элементов списка из одного елемента - | |
% равна 0, если елемент не отрицательный. | |
sum_neg([X], 0) :- X >= 0. | |
% Сумма отрицательных элементов (СОЭ) - | |
% сумма первого элемента и СОЭ хвоста списка, | |
% если первый элемент - отрицательный. | |
% В данном случае хвост - исходный список без первых двух элементов. | |
sum_neg([H, _ | T], S) :- | |
sum_neg(T, TS), | |
H < 0, | |
S is TS + H. | |
% Сумма отрицательных элементов (СОЭ) - | |
% СОЭ хвоста списка, если первый элемент - не отрицательный. | |
% В данном случае хвост - исходный список без первых двух элементов. | |
sum_neg([H, _ | T], S) :- | |
sum_neg(T, TS), | |
H >= 0, | |
S is TS. | |
% (вариант-1) Сформировать новый список из всех четных элементов исходного списка. | |
% если исходный список пустой, то результат тоже пустой. | |
con_even([], []). | |
% Список четных элементов (СЧЭ) исходного списка - | |
% объединение первого элемента исходного списка и СЧЭ хвоста исходного списка, | |
% если первый элемент исходного списка кратен 2-м. | |
con_even([H | T], R) :- | |
con_even(T, TR), | |
0 is mod(H, 2), | |
R = [H | TR]. | |
% Список четных элементов (СЧЭ) исходного списка - | |
% СЧЭ хвоста исходного списка, | |
% если первый элемент исходного списка не кратен 2-м. | |
con_even([H | T], R) :- | |
con_even(T, TR), | |
1 is mod(H, 2), | |
R = TR. | |
% (вариант-6) Слить два упоpядоченных списка в один, сохpанив упоpядоченность. | |
% слияние пустого списка с непустым L2 - есть список L2. | |
conc([], L2, L2). | |
% слияние непустого L1 списка с пустым - есть список L1. | |
conc(L1, [], L1). | |
% Упорядоченное слияние (УС) двух упорядоченных списков - | |
% слияние первого элемента первого списка и (УС хвоста первого списка и второго списка), | |
% если первый элемент первого списка меньше первого элемента второго списка. | |
conc(L1, L2, R) :- | |
L1 = [HL1 | TL1], | |
L2 = [HL2 | _], | |
HL1 < HL2, | |
conc(TL1, L2, TR), | |
R = [HL1 | TR]. | |
% Упорядоченное слияние (УС) двух упорядоченных списков - | |
% слияние первого элемента второго списка и (УС хвоста второго списка и первого списка), | |
% если первый элемент первого списка не меньше первого элемента второго списка. | |
conc(L1, L2, R) :- | |
L1 = [HL1 | _], | |
L2 = [HL2 | TL2], | |
HL1 >= HL2, | |
conc(L1, TL2, TR), | |
R = [HL2 | TR]. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
% Тобола Кирилл гр.2471 лабораторная 3 | |
% (вариант-20) Расставить максимальное число белых ладей, | |
% чтобы они не били друг друга. | |
generate_chess_desk([]). | |
generate_chess_desk([X | T]) :- | |
between(1, 8, Y), | |
between(1, 8, Z), | |
X = [Y, Z], | |
generate_chess_desk(T). | |
% максимальное число таких ладей на доске 8x8 = 8, ладьи будут стоять на разных горизонталях. | |
optimized([[1, _], [2, _], [3, _], [4, _], [5, _], [6, _], [7, _], [8, _]]). | |
row_member(X, [[X, _] | _]). | |
row_member(X, [_ | T]) :- row_member(X, T). | |
col_member(X, [[_, X] | _]). | |
col_member(X, [_ | T]) :- col_member(X, T). | |
doesnt_hit_other([]). | |
doesnt_hit_other([[Row, Col] | T]) :- | |
not(row_member(Row, T)), | |
not(col_member(Col, T)), | |
doesnt_hit_other(T). | |
arrange_rooks(L) :- | |
%%% для полного принта (список обрезается с помощью: '...') : | |
% set_prolog_flag(answer_write_options, [max_depth(0)]), | |
optimized(L), | |
generate_chess_desk(L), | |
doesnt_hit_other(L). | |
% (вариант-2) Решение диофантова уравнения 4𝑥 + 5𝑦 = 0 для значений | |
% переменных 𝑥 и 𝑦 из некоторого диапазона, | |
% значения переменных — целые числа. | |
generate_roots(_, _, []). | |
generate_roots(Low, High, [X | T]) :- | |
between(Low, High, X), | |
generate_roots(Low, High, T). | |
equasion([X, Y]) :- | |
0 is 4*X + 5*Y. | |
solve_equasion(Low, High, [X, Y]) :- | |
generate_roots(Low, High, [X, Y]), | |
equasion([X, Y]). | |
% (вариант-5) Решить задачу о выполнимости функции x1 x2 !x3 V !x1 x2 x3 | |
% подсчитать количество выполняющих наборов. | |
bool(X) :- | |
member(X, [false, true]). | |
generate_variables([]). | |
generate_variables([X | T]) :- | |
bool(X), | |
generate_variables(T). | |
boolean_equasion([X1, X2, X3]) :- | |
X1, X2, not(X3); | |
not(X1), X2, X3. | |
solve_boolean_equasion([X1, X2, X3]) :- | |
generate_variables([X1, X2, X3]), | |
boolean_equasion([X1, X2, X3]). | |
count_roots(X) :- | |
findall(Root, solve_boolean_equasion(Root), Roots), | |
length(Roots, X). |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment