Пролог, счетчик - PullRequest
       7

Пролог, счетчик

0 голосов
/ 09 февраля 2012

Я хочу рассчитать в двух списках (одинаковой длины) количество элементов, которые равны и находятся в одной и той же позиции.Например: допустим, у нас есть списки A = [3,6,7,9] и B = [2,6,4,9], я хочу напечатать на экране сообщение «2 быка найдено».

Пока я сделал это:

bulls([],[]).
bulls([Ha|Ta],[Hb|Tb]) :-
    Ha = Hb,
    writeln('bull found'),
    bulls(Ta,Tb);
    bulls(Ta,Tb).

Каждый раз, когда элемент, который существует в одном и том же месте в обоих списках, печатается сообщение «найден бык».И, на мой взгляд, я хочу сделать что-то вроде этого:

bulls([],[],_).
bulls([Ha|Ta],[Hb|Tb],Counter) :-
    Ha = Hb,
    NewCounter is Counter + 1,
    bulls(Ta,Tb,NewCounter);
    bulls(Ta,Tb,NewCounter).

bulls(List1,List2):- bulls(List1,List2,0).

bulls вызывается из другого правила, которое проходит через два списка.Как мне сделать так, чтобы он выводил значение «быков» на экран.Любая помощь?


Редактировать Так что после Сьюки , я сделал эту тестовую программу тестирования 2 списка:

bulls([],[],X), write(X), write('bulls found'),fail.
bulls([Ha|Ta],[Hb|Tb],Counter) :-
    Ha = Hb,
    NewCounter is Counter + 1,
    bulls(Ta,Tb,NewCounter);
    bulls(Ta,Tb,NewCounter).

check(List1,List2):- 
    bulls(List1,List2,0).


start:-
    A=[1,1,1,1],
    B=[2,1,2,1],
    writeln(A),writeln(B),
    check(A,B).

получить этот результат

1 ?- start.
[1,1,1,1]
[2,1,2,1]
ERROR: bulls/3: Arguments are not sufficiently instantiated

что я делаю не так?

Ответы [ 2 ]

1 голос
/ 09 февраля 2012

Относительно вашей отредактированной программы:

Первый пункт - не пункт, это цель!Это должно выглядеть так:

bulls([],[],X) :- write(X), write(' bulls found').

Вы должны удалить fail, кстати.

Во втором предложении вам нужно использовать «if-then-else» и использоватьCounter вместо NewCounter в ветке "else":

bulls([Ha|Ta],[Hb|Tb],Counter) :-
  (
    Ha == Hb
  ->
    NewCounter is Counter + 1,
    bulls(Ta,Tb,NewCounter)
  ;
    bulls(Ta,Tb,Counter)
  ).
0 голосов
/ 12 февраля 2012

Предполагая, что предикаты findall, length, nth0 существуют в вашей реализации пролога:
(Ниже приведен след от пролога)

A = [3,6,7,9], 
B = [2,6,4,9], 
findall(Y, ((nth0(X, A, Y), nth0(X, B, Y))), Y),
length(Y, LenY),
write(LenY), write(' Bulls Found').

[trace]  ?- A = [3,6,7,9], 
B = [2,6,4,9], 
findall(Y, ((nth0(X, A, Y), nth0(X, B, Y))), Y),
length(Y, LenY),
write(LenY), write(' Bulls Found').
   Call: (7) _G2814=[3, 6, 7, 9] ? creep
   Exit: (7) [3, 6, 7, 9]=[3, 6, 7, 9] ? creep
   Call: (7) _G2829=[2, 6, 4, 9] ? creep
   Exit: (7) [2, 6, 4, 9]=[2, 6, 4, 9] ? creep
^  Call: (7) findall(_G2834, (nth0(_G2832, [3, 6, 7, 9], _G2834), nth0(_G2832, [2, 6, 4, 9], _G2834)), _G2834) ? creep
   Call: (13) lists:nth0(_G2832, [3, 6, 7, 9], _G2834) ? creep
   Exit: (13) lists:nth0(0, [3, 6, 7, 9], 3) ? creep
   Call: (13) lists:nth0(0, [2, 6, 4, 9], 3) ? creep
   Fail: (13) lists:nth0(0, [2, 6, 4, 9], 3) ? creep
   Redo: (13) lists:nth0(_G2832, [3, 6, 7, 9], _G2834) ? creep
   Exit: (13) lists:nth0(1, [3, 6, 7, 9], 6) ? creep
   Call: (13) lists:nth0(1, [2, 6, 4, 9], 6) ? creep
   Exit: (13) lists:nth0(1, [2, 6, 4, 9], 6) ? creep
   Redo: (13) lists:nth0(_G2832, [3, 6, 7, 9], _G2834) ? creep
   Exit: (13) lists:nth0(2, [3, 6, 7, 9], 7) ? creep
   Call: (13) lists:nth0(2, [2, 6, 4, 9], 7) ? creep
   Fail: (13) lists:nth0(2, [2, 6, 4, 9], 7) ? creep
   Redo: (13) lists:nth0(_G2832, [3, 6, 7, 9], _G2834) ? creep
   Exit: (13) lists:nth0(3, [3, 6, 7, 9], 9) ? creep
   Call: (13) lists:nth0(3, [2, 6, 4, 9], 9) ? creep
   Exit: (13) lists:nth0(3, [2, 6, 4, 9], 9) ? creep
^  Exit: (7) findall([6, 9], user: (nth0(_G2832, [3, 6, 7, 9], [6, 9]), nth0(_G2832, [2, 6, 4, 9], [6, 9])), [6, 9]) ? creep
   Call: (7) length([6, 9], _G2848) ? creep
   Exit: (7) length([6, 9], 2) ? creep
   Call: (7) write(2) ? creep
2
   Exit: (7) write(2) ? creep
   Call: (7) write(' Bulls Found') ? creep
 Bulls Found
   Exit: (7) write(' Bulls Found') ? creep
A = [3, 6, 7, 9],
B = [2, 6, 4, 9],
Y = [6, 9],
LenY = 2.
...