Skip to content

Instantly share code, notes, and snippets.

@kirilltobola
Created January 21, 2022 14:28
Show Gist options
  • Save kirilltobola/c76c88dc40a28c8591eed7ccdf3760aa to your computer and use it in GitHub Desktop.
Save kirilltobola/c76c88dc40a28c8591eed7ccdf3760aa to your computer and use it in GitHub Desktop.
Prolog AI
% Тобола К. 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).
% Тобола Кирилл гр. 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].
% Тобола Кирилл гр.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