Учитывая такой запрос:Проверьте список состоит из N экземпляров X (X повторить N раз)
containsN(4,2,Z).
я должен получить: Z = [2,2,2,2].
или
containsN(4,W,[3,3,3,3])
я должен получить: W = 3.
Итак, другими словами, для первого примера мне нужно 4 экземпляра 2 в списке связанного с Z.
Для второго примера мне нужен элемент в списке, примененный 4 раза, связанный с W.
Моя попытка до сих пор приводит к бесконечному циклу:
containsN(Y,W,Z) :- contains_helper(Y,W,Z).
contains_helper(0,_,_).
contains_helper(Y,W,[H|T]) :- W = H, Y0 is Y - 1, contains_helper(Y0,W,T).
Идея заключается в том, что я называю вспомогательную функцию, чтобы я мог проверять элементы Z один за другим. Когда счетчик достигает 0, я знаю, что список истинен, потому что для каждой итерации H = W. Однако я получаю бесконечный цикл.
Ваш код работает очень хорошо (при условии, что 'fill_helper'' 'contains_helper'). Какой вход вызывает бесконечный цикл? –
Когда вы достигнете '0', вы также знаете, что список должен быть пустым. Для хелперного предиката нет причин. «W = H» может быть ограничено перемещением унификации в голове предложения: 'contains_helper (Y, W, [W | T]): - ...'. –
Кроме того, вы должны проверить, больше ли 'Y' больше 0 (и, возможно, после этого вырезается). В качестве альтернативы, разрежьте основной футляр (список пуст/счетчик 0). Это устраняет проблемы с циклом. –