Пролог - странная проблема - PullRequest
1 голос
/ 08 февраля 2012

Итак, у меня есть задание, в котором я должен сделать игру в догадки ( быков и коров ). Во-первых, я сделал небольшую программу, где вы вводите два числа, и он проверяет если они имеют одинаковую длину, а затем, если они равны. * Числа имеют , должны иметь в списках, чтобы можно было в каждом предположении указать количество быков и коров (см. Правила игры).

    equal([],[]).
    equal([Ha|Ta],[Hb|Tb]) :-
        Ha = Hb, equal(Ta,Tb).

    check_length(List1,List2):-
            same_length(List1,List2),writeln('The Lists have the same length!').

    check_equality(List1,List2):-
            equal(List1,List2),writeln('The Lists are equal!').
start:-
    write('give 1st list:'), read(X),atom_chars(X, List1),
    write('give 2nd list:'), read(Y),atom_chars(Y, List2),
    check_length(List1,List2),
    check_equality(List1,List2).

Пока все хорошо. Работает нормально. Затем я перешел к следующему шагу и изменил его, поэтому он генерирует список с 4 случайными целыми числами, а затем ждет, пока пользователь сделает предположение, и сравнивает два списка, как и раньше. * Очевидно, что я печатаю сгенерированное число на экран, чтобы узнать, работает ли программа нормально.

start:-
    A is random(9),
    B is random(9),
    C is random(9),
    D is random(9),
    List2=[A,B,C,D],
    write('Generated number:'),writeln(List2),
    write('Make a guess:'), read(Guess),atom_chars(Guess, List1),
    nl,
    check_length(List1,List2),
    check_equality(List1,List2).

Проблема в том, что на этот раз, даже если вы введете правильное число, программа определит, имеют ли списки (числа) одинаковую длину, но не проходит проверку на равенство. Что я делаю не так?

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 08 февраля 2012

Вот след от пробега:

[trace] 42 ?- start.
   Call: (6) start ? creep
^  Call: (7) _G537 is random(9) ? creep
^  Exit: (7) 6 is random(9) ? creep
^  Call: (7) _G539 is random(9) ? creep
^  Exit: (7) 6 is random(9) ? creep
^  Call: (7) _G541 is random(9) ? creep
^  Exit: (7) 1 is random(9) ? creep
^  Call: (7) _G543 is random(9) ? creep
^  Exit: (7) 4 is random(9) ? creep
   Call: (7) _G555=[6, 6, 1, 4] ? creep
   Exit: (7) [6, 6, 1, 4]=[6, 6, 1, 4] ? creep
   Call: (7) write('Generated number:') ? creep
Generated number:
   Exit: (7) write('Generated number:') ? creep
   Call: (7) writeln([6, 6, 1, 4]) ? creep
[6,6,1,4]
   Exit: (7) writeln([6, 6, 1, 4]) ? creep
   Call: (7) write('Make a guess:') ? creep
Make a guess:
   Exit: (7) write('Make a guess:') ? creep
   Call: (7) read(_G555) ? creep    
|    6614.
   Exit: (7) read(6614) ? creep
   Call: (7) atom_chars(6614, _G556) ? creep
   Exit: (7) atom_chars(6614, ['6', '6', '1', '4']) ? creep
   Call: (7) nl ? creep
   Exit: (7) nl ? creep
   Call: (7) check_length(['6', '6', '1', '4'], [6, 6, 1, 4]) ? creep
   Call: (8) length(['6', '6', '1', '4'], _G568) ? creep
   Exit: (8) length(['6', '6', '1', '4'], 4) ? creep
   Call: (8) length([6, 6, 1, 4], 4) ? creep
   Exit: (8) length([6, 6, 1, 4], 4) ? creep
   Call: (8) writeln('The Lists have the same length!') ? creep
The Lists have the same length!
   Exit: (8) writeln('The Lists have the same length!') ? creep
   Exit: (7) check_length(['6', '6', '1', '4'], [6, 6, 1, 4]) ? creep
   Call: (7) check_equality(['6', '6', '1', '4'], [6, 6, 1, 4]) ? creep
   Call: (8) equal(['6', '6', '1', '4'], [6, 6, 1, 4]) ? creep
   Call: (9) '6'=6 ? creep
   Fail: (9) '6'=6 ? creep
   Fail: (8) equal(['6', '6', '1', '4'], [6, 6, 1, 4]) ? creep
   Fail: (7) check_equality(['6', '6', '1', '4'], [6, 6, 1, 4]) ? creep
   Fail: (6) start ? creep
false.

важная часть такова:

   Call: (9) '6'=6 ? creep
   Fail: (9) '6'=6 ? creep

так что проблема в том, что символ '6' не равен числу 6 Другая проблема заключается в том, что нули в начале будут удалены

23 ?- atom_chars(0042,L).
L = ['4', '2'].

поэтому я бы предложил избавиться от atom_chars / 2 и заняться чем-нибудь еще; читать четыре числа по одному или разбивать число вручную

2 голосов
/ 08 февраля 2012

Во втором коде List2 - это список чисел.List1 однако, как генерируется atom_chars/2, это список цитируемых атомов.Числа и атомы не одно и то же.Вам придется преобразовать один из списков в тип другого (например, с помощью atom_number/2), прежде чем проверка на равенство пройдет успешно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...