? users online
  • Logout
    • Open hangout
    • Open chat for current file
<div class="notebook">

<div class="nb-cell markdown" name="md1">
*Логическая задача: Результаты соревнования*
</div>

<div class="nb-cell markdown" name="md2">
В спортивных соревнованиях принимали участие пять пионерских команд:
</div>

<div class="nb-cell markdown" name="md3">
"Вымпел", "Метеор", "Нептун", "Старт" и "Чайка".
</div>

<div class="nb-cell program" data-background="true" name="p1">
game_pool(["Вымпел", "Метеор", "Нептун", "Старт", "Чайка"]).
</div>

<div class="nb-cell markdown" name="md4">
Об их итогах соревнования имеется пять высказываний:
</div>

<div class="nb-cell markdown" name="md5">
1) Второе место занял "Вымпел", a "Cтарт" оказался на третьем.
</div>

<div class="nb-cell program" data-background="true" name="p2">
game_claim(1, place("Вымпел", 2), place("Старт", 3)).
</div>

<div class="nb-cell markdown" name="md7">
2) Хорошо выступала команда "Нептун", она стала победителем, а "Чайка" вышла на второе место.
</div>

<div class="nb-cell program" data-background="true" name="p3">
game_claim(2, place("Нептун", 1), place("Чайка", 2)).
</div>

<div class="nb-cell markdown" name="md8">
3) Да нет же, "Чайка" заняла только третье место, а "Нептун"- был последним.
</div>

<div class="nb-cell program" data-background="true" name="p4">
game_claim(3, place("Чайка", 3), place("Нептун", 5)).
</div>

<div class="nb-cell markdown" name="md9">
4) Первое место по праву завоевал "Cтарт", а "Метеор" был четвертым.
</div>

<div class="nb-cell program" data-background="true" name="p5">
game_claim(4, place("Старт", 1), place("Метеор", 4)).
</div>

<div class="nb-cell markdown" name="md10">
5) Да, "Метеор" действительно был четвертым, а "Вымпел" был вторым.
</div>

<div class="nb-cell program" data-background="true" name="p6">
game_claim(5, place("Метеор", 4), place("Вымпел", 2)).
</div>

<div class="nb-cell markdown" name="md11">
Известно, что команды не делили места между собой,
</div>

<div class="nb-cell markdown" name="md12">
и, что в каждом высказывании одно утверждение правильное, а другое нет.
</div>

<div class="nb-cell markdown" name="md13">
Как распределились места между командами?
</div>

<div class="nb-cell markdown" name="md14">
Основной код:
</div>

<div class="nb-cell program" data-background="true" name="p7">
game_result :-
    game_pool(Xs),
    permutation1(Xs, Ys),
    game_check(Ys),
    game_result_out(Ys).

game_result(Zs) :-
    game_pool(Xs),
    permutation1(Xs, Ys),
    game_check(Ys),
    game_result_out(Ys, Ys, Zs).

game_check(Ys) :-
    game_check(Ys, 1, 5).

game_check(_, K0, K) :-
    K0 &gt; K.
game_check(Ys, K0, K) :-
    not( K0 &gt; K ),
    game_claim(K0, Claim1, Claim2),
    game_check_claim(Ys, Claim1, Claim2),
    K1 is K0 + 1,
    game_check(Ys, K1, K).

game_check_claim(Ys, place(Team1, Place1), place(Team2, Place2)) :-
    on_place(Ys, Team1, Place1),
    not( on_place(Ys, Team2, Place2) ).
game_check_claim(Ys, place(Team1, Place1), place(Team2, Place2)) :-
    not( on_place(Ys, Team1, Place1) ),
    on_place(Ys, Team2, Place2).

game_result_out(Ys) :-
    member1(Y, Ys),
    on_place(Ys, Y, N),
    write(N), write("-"), write(Y), nl,
    fail.
game_result_out(_).

game_result_out([], _, []).
game_result_out([Y | Ys], Ys0, [result(N, Y) | Zs]) :-
    on_place(Ys0, Y, N),
    game_result_out(Ys, Ys0, Zs).

on_place(Xs, X, N) :-
    on_place(Xs, X, N, 1).

on_place([X | _], X, N, N).
on_place([_ | Xs], X, N, N0) :-
    N1 is N0 + 1,
    on_place(Xs, X, N, N1).
</div>

<div class="nb-cell markdown" name="md17">
Библиотечные предикаты:
</div>

<div class="nb-cell program" data-background="true" name="p8">
permutation1([], []).
permutation1(List, [First | Perm]) :-
        select1(First, List, Rest),
        permutation1(Rest, Perm).

select1(Elem, [Elem | Tail], Tail).
select1(Elem, [Head | Tail], [Head | Rest]) :-
    select1(Elem, Tail, Rest).

member1(Elem, [Elem | _]).
member1(Elem, [_ | Tail]):-
    member1(Elem, Tail).
</div>

<div class="nb-cell markdown" name="md18">
Запрос для вывода результата:
</div>

<div class="nb-cell query" name="q1">
game_result.
</div>

<div class="nb-cell markdown" name="md19">
Запрос с использованием табличного вывода:
</div>

<div class="nb-cell program" data-background="true" name="p9">
:- use_rendering(table, [header(result('Место','Команда'))]).
</div>

<div class="nb-cell query" name="q2">
game_result(Zs).
</div>

</div>