Для решения этой задачи можно использовать таблицу истинности. Предположим, что A говорит правду. Тогда по его утверждению C не давал ложные показания, если B дал ложные показания. Но это противоречит утверждению C, что он дал ложные показания. Значит, A лжет.
Теперь предположим, что B говорит правду. По его утверждению, либо A, либо C дал ложные показания. Но это противоречит утверждению C, что B не давал ложные показания. Значит, B тоже лжет.
Теперь предположим, что C говорит правду. По его утверждению, B не давал ложные показания, но это противоречит утверждению D, что B дал ложные показания. Значит, C тоже лжет.
Таким образом, остается вариант, что D говорит правду. По его утверждению, B дал ложные показания, что не противоречит другим утверждениям.
Итак, правильный ответ: D - лжет.