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 Файловые
системы Драйверы устройств