Skip to content

Instantly share code, notes, and snippets.

@kirilltobola
Created January 21, 2022 14:28

Revisions

  1. kirilltobola created this gist Jan 21, 2022.
    25 changes: 25 additions & 0 deletions lab1.pl
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,25 @@
    % Тобола К. 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).
    83 changes: 83 additions & 0 deletions lab2.pl
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,83 @@
    % Тобола Кирилл гр. 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].
    71 changes: 71 additions & 0 deletions lab3.pl
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,71 @@
    % Тобола Кирилл гр.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).