Первое, что нужно отметить, что ваш «список списков» в корне структура дерева, и вы в основном делает глубину - первый, слева направо обход дерева.
Итак, вам нужен «общедоступный» предикат, который может искать дерево для элемента и возвращать его глубину. должен возврат возвращает все такие матчи:
tree_walk(X , Tree , Depth) :-
tree_walk(X , Tree , 0 , Depth) % seed the accumulator with an initial depth
.
Тогда вам нужен работник предикат:
tree_walk(X , [ X | _ ] , D , D) % success! if the desired item is found
. %
tree_walk(X , [ Y | Ys ] , T , D) :- % otherwise...
T1 is T+1 , % - increment the depth
tree_walk(X , Y , T1 , D) % - and recurse down on the head of the list
. %
tree_walk(X , [ _ | Ys ] , T , D) :- % if that failed, then
tree_walk(X , Ys , T , D) % - recursively search the tail of the list
. %
Вот и все, что нужно сделать.
ПРИМЕЧАНИЯ
Чтобы изменить его на поиск в ширину, все, что вам нужно сделать, я думаю, это изменить порядок последних двух положений работника предиката.
если X
несвязано или один из элементов в «списке списков» несвязан, вы, вероятно, столкнетесь с ... интересными проблемами. Для производственного кода вы хотите установить защитные меры для правильной работы с этими краевыми случаями.
Cheers!
Спасибо, это помогло. И это не домашнее задание, просто изучать себя :) – gestalt
@ azur3al Другими словами, это домашняя работа, которую вы назначили себе :) Удачи с Prolog, это увлекательный маленький язык. – dasblinkenlight