Я учусь использовать пролог со списками, применять команду трассировки и сам рисовать трассировку бумаги, но я не очень хорошо понимаю, как отладка делает это со списками (без списков, если это так).У меня есть следующий пример программы.
p([X],X).
p([X|L],Y):-p(L,Y).
q([X,X]).
, и я применяю запрос
p(V,2),q(V).
, и я получаю ребенка для консоли, это
Call: (9) p(_612, 2) ? creep
Exit: (9) p([2], 2) ? creep
Call: (9) q([2]) ? creep
Fail: (9) q([2]) ? creep
Redo: (9) p(_612, 2) ? creep
Call: (10) p(_902, 2) ? creep
Exit: (10) p([2], 2) ? creep
Exit: (9) p([_900, 2], 2) ? creep
Call: (9) q([_900, 2]) ? creep
Exit: (9) q([2, 2]) ? creep
V = [2, 2] ;
изатем цикл до бесконечности, но это не имеет значения для меня, потому что я не знаю, как получить решение V = [2, 2];
Делая соответствующие замены так, чтобы они объединялись, я получаю длялитерал p (V, 2)
[X] = L
2 = X
[X | L] = V
[2 | L] = V
Итак, я хочу знать значение V, поэтому у меня будет [2, [2]], и это можно перевести в [2, 2]?
Тогда я должен был бы проверить это для второго литерала q (V), который объединяет, так что это правильное решение.Это твои рассуждения?