Пролог - Подсчет совпадений в двух списках - PullRequest
0 голосов
/ 24 декабря 2018

Я пытаюсь понять язык пролога (с помощью программы 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([ ]).

1 Ответ

0 голосов
/ 24 декабря 2018

[решено]

find_bull_and_cows(OldAssemption,Assemption,Bulls,Cows):-
        exact_match(OldAssemption,Assemption,Bulls),
        common_numbers(OldAssemption,Assemption,N2),
        Cows= N2 - Bulls.

%bulls finding
    exact_match(X,Y,N):- exact_match(X,Y,0,N).
    exact_match([Digit|OldPin],[Digit|NewPin],K,N):- !, 
        K1=K+1,
        exact_match(OldPin,NewPin,K1,N).
    exact_match([_|OldPin],[_|NewPin],K,N):- exact_match(OldPin,NewPin,K,N).
    exact_match([],[],N,N).

%cows finding
    common_numbers(X,Y,N):- common_numbers(X,Y,0,N).
    common_numbers([Digit|OldPin],NewPin,K,N):- 
        member(Digit,NewPin), !, 
        K1=K+1,
        common_numbers(OldPin,NewPin,K1,N).     
    common_numbers([_|OldPin],NewPin,K,N):- common_numbers(OldPin,NewPin,K,N).
    common_numbers([],_,N,N).    

%member of list
    member(A,[A|_]):- !.
    member(A,[_|L]):- member(A,L).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...