Программа "Быки и Коровы"

master mind (Code): -cleanup, guess (Code), check (Code), announce
guess(Code):-Code=[X1,X2,X3,X4],selects(Code,[1,2,3,4,5,6,7,8,9,0]).

/* Verify the proposed guess */

check(Guess):-not inconsistent(Guess),ask(Guess).

inconsistent(Guess):-query(OldGuess,Bulls,Cows), not bulls_and_cows_match(OldGuess,Guess,Bulls,Cows).

bulls_and_cows_match(OldGuess,Guess,Bulls,Cows):-
exact_matches(OldGuess,Guess,N1),
Bulls =:= N1,
common_members(OldGuess,Guess,N2),
Cows =:= N2 - Bulls.

exact_matches(X,Y,N):-size_of(A,same_place(A,X,Y),N).

common_members(X,Y,N):-size_of(A,(member(A,X),member(A,Y)),N).

same_place(X,[X|Xs],[X|Ys]).
same_place(A,[X|Xs],[Y|Ys]):-same_place(A,Xs,Ys).

/* Asking a guess */

ask(Guess):-repeat,write_ln(['How many bulls and cows in ',Guess,'?']),
read((Bulls,Cows)),
sensible(Bulls,Cows), !,
assert(query(Guess,Bulls,Cows)),
Bulls=:=4.

sensible(Bulls,Cows):-integer(Bulls),integer(Cows),Bulls+Cows=4.

/* Bookkeeping */

cleanup :- abolish(query,3).

announce :-
size_of(X,query(X,A,B),N),
write_ln(['Found the answer after ',N,' queries']).

size_of(X,Goal,N) :-
findall(X,Goal,Instances),length(Instances,N).

selects([X|Xs],Ys) :-
select(X,Ys,Ys1),selects(Xs,Ys1).
selects([],Ys).
select(X,[X|Xs],Xs).
select(X,[Y|Ys],[Y|Zs]) :-
select(X,Ys,Zs).

length(Xs,N) :- length(Xs,0,N).
length([X|Xs],Acc,N) :-
Acc1 is Acc + 1,
length(Xs,Acc1,N).
length([],N,N).

Спрашивающая процедура guess действует как генератор, использует процедуру selekt (Xs Ys) для недетерминированного выбора списка Хs из элементов списка Ys Согласно правилам игры, Хs ограничивается четырьмя различными десятичными цифрами, в то время как список Ys содержит 10 десятичных цифр. Процедура check (guess)

Классификация операционных систем Виртуальная память Реализация многозадачности
Системы безопасности Операционная система Linux Введение в компьютерные сети Принципы построения вычислительных систем Базовые технологии локальной сетиСредства анализа Процедуры и функции Pascal Язык запросов SQL Программирование на СИ Брандмауэры Протоколы TCP/IP Файловые системы Драйверы устройств