Я пытаюсь понять язык пролога (с помощью программы Visual Prolog 5.1 / 5.2 )
Есть задача - реализоватьигра «Быки и коровы» (или Выдающийся ум).
Игрок делает число (составленное из чисел от 0 до 9, без повторений), дляНапример, 1458, и вводит его в программу.Компьютер пытается угадать это число, выдвигая предположения.Затем он спрашивает игрока, сколько «быков» (точных совпадений) и сколько «коров» (совпадающих чисел, которые не находятся на своих местах).Я написал программу, которая делает это.Это работает.
Теперь я хочу, чтобы компьютер подсчитал количество быков и коров .Как это сделать правильно?
Это работа с двумя списками.
DOMAINS
list = integer*
list1 - ключ (скрытый номер), list2 - предположение (компьютер)
Я пытался написать предикат для подсчета быков, но программа выдает «Нет решения» (возможно, по причине ниже ( преобразование ))
comparison(_Key, Assemption, Bulls /*, Cows*/):-
find_bulls(_Key, Assemption, Bulls),
%find_cows(_Key, Assemption, Cows).
find_bulls(Key, Assemption, Bulls):-
find_bulls(Key, Assemption, Bulls, 0).
find_bulls([],[], Bulls, Amount):- Bulls=Amount,!.
find_bulls([A1|L1],[A2|L2], Bull, Amount):-
A1 = A2,
Am = Amount + 1,
find_bulls(L1, L2, Bull, Am).
Iтакже прочитайте число через readint(_Key)
, но _Key не список, не так ли? как преобразовать целое число в список для подачи предиката?
question(Assemption,_Key):-
assemption(Assemption),
not(contradictory(Assemption)),
%------------------------------------------------------------
comparaison(_Key,Assemption, Bulls /*,Cows*/),
%------------------------------------------------------------
write(" My assemption: ", Assemption), nl,
write("How much bulls? -----> ", Bulls), nl, %readint(Bulls),
write("How much cows? -----> "), /*Cows)*/ readint(Cows), nl,
Bulls + Cows <= size,
assert(request(Assemption, Bulls, Cows)),
Bulls = size,
!.
Спасибо!
/ ----------------------------------------------------------------------------- /
new Добавление (чтение списка с клавиатуры, остановка при вводе символа):
domains
list=integer*
predicates
readlist(list)
clauses
readlist([H|T]):-
write("> "),
readint(H),!,
readlist(T).
readlist([ ]).