Новичок
Профиль
Группа: Участник
Сообщений: 9
Регистрация: 7.5.2009
Репутация: нет Всего: нет
|
Приветствую уважаемых форумчан. Очень нуждаюсь в вашей помощи (хотя бы в виде совета). Целый день бьюсь сегодня с проблемой и понимаю, что чего-то недопонимаю, а чего именно недопонимаю - не понимаю Суть вопроса. Есть программа, которая читает из базы древовидную структуру и выводит ее содержимое поиском в глубину - тут проблем нет. При выводе элементов необходимо смотреть и выводить только элементы, содержащие заданную подстроку.. Вот тут карусель какая-то. Определение подстроки в строке делаю так: посредством name делаю из аргументов списки кодов, и уже ищу подсписок в списке. фрагмент данного куска: Код | % ---------- finds B as a sublist of A ---------- hasSublist([X|A], [X|B]) :- coincedent(A, B), !. hasSublist([_|A], B) :- hasSublist(A, B). hasSublist([], _) :- !,fail. coincedent([X|A], [X|B]) :- coincedent(A, B). coincedent(_, []). :-op(100, xfx, hasSublist). % --------- finds substring in a string --------- search(STRING, SUBSTRING):- name(STRING, STRING_LIST), name(SUBSTRING, SUBSTRING_LIST), STRING_LIST hasSublist SUBSTRING_LIST.
|
И тут вроде бы все ничего - когда совпадения найдены - программа все выводит как надо, но когда совпадения в данном элементе дерева не найдено, то Fail, который получается в hasSublist не приводит к рассмотрению следующего предложения (в трассировке - REDO), а проходит до самого начала программы, тем самым отсекая сразу все решения (которых еще много).. Вот фрагмент трассировки программы: Код | ?- load('treeexample.txt'). Loading... Data Loaded true. ?- trace. true. [trace] ?- | findWayInTree(an). Correct to: "findWaysInTree(an)"? yes Call: (8) findWaysInTree(an) ? creep Call: (9) write("Searching for '") ? creep Searching for ' Exit: (9) write("Searching for '") ? creep Call: (9) write(an) ? creep an Exit: (9) write(an) ? creep Call: (9) write("'...") ? creep '... Exit: (9) write("'...") ? creep Call: (9) nl ? creep Exit: (9) nl ? creep Call: (9) root(_8844) ? creep Exit: (9) root(friends) ? creep Call: (9) node(friends, _8846) ? creep Exit: (9) node(friends, [andrew, ann]) ? creep Call: (9) findNodeWay(an, friends, [andrew, ann], [friends]) ? creep Call: (10) node(andrew, _8864) ? creep Exit: (10) node(andrew, [john, vikki, annet]) ? creep Call: (10) lists:append([[friends], [andrew]], _8900) ? creep Exit: (10) lists:append([[friends], [andrew]], [friends, andrew]) ? creep Call: (10) printWay(an, andrew, [friends, andrew]) ? creep Call: (11) search(andrew, an) ? creep Call: (12) name(andrew, _8912) ? creep Exit: (12) name(andrew, [97, 110, 100, 114, 101, 119]) ? creep Call: (12) name(an, _8948) ? creep Exit: (12) name(an, [97, 110]) ? creep Call: (12) [97, 110, 100, 114, 101, 119]hasSublist[97, 110] ? creep Call: (13) coincedent([110, 100, 114, 101, 119], [110]) ? creep Call: (14) coincedent([100, 114, 101, 119], []) ? creep Exit: (14) coincedent([100, 114, 101, 119], []) ? creep Exit: (13) coincedent([110, 100, 114, 101, 119], [110]) ? creep Exit: (12) [97, 110, 100, 114, 101, 119]hasSublist[97, 110] ? creep Exit: (11) search(andrew, an) ? creep Call: (11) write('found: ') ? creep found: Exit: (11) write('found: ') ? creep Call: (11) write(andrew) ? creep andrew Exit: (11) write(andrew) ? creep Call: (11) write('; way:=') ? creep ; way:= Exit: (11) write('; way:=') ? creep Call: (11) write([friends, andrew]) ? creep [friends,andrew] Exit: (11) write([friends, andrew]) ? creep Call: (11) nl ? creep Exit: (11) nl ? creep Exit: (10) printWay(an, andrew, [friends, andrew]) ? creep Call: (10) findNodeWay(an, andrew, [john, vikki, annet], [friends, andrew]) ? creep Call: (11) node(john, _8960) ? creep Exit: (11) node(john, [evette, victory]) ? creep Call: (11) lists:append([[friends, andrew], [john]], _8990) ? creep Exit: (11) lists:append([[friends, andrew], [john]], [friends, andrew, john]) ? creep Call: (11) printWay(an, john, [friends, andrew, john]) ? creep Call: (12) search(john, an) ? creep Call: (13) name(john, _9008) ? creep Exit: (13) name(john, [106, 111, 104, 110]) ? creep Call: (13) name(an, _9032) ? creep Exit: (13) name(an, [97, 110]) ? creep Call: (13) [106, 111, 104, 110]hasSublist[97, 110] ? creep Call: (14) [111, 104, 110]hasSublist[97, 110] ? creep Call: (15) [104, 110]hasSublist[97, 110] ? creep Call: (16) [110]hasSublist[97, 110] ? creep Call: (17) []hasSublist[97, 110] ? creep Call: (18) fail ? creep Fail: (18) fail ? creep Fail: (17) []hasSublist[97, 110] ? creep Fail: (16) [110]hasSublist[97, 110] ? creep Fail: (15) [104, 110]hasSublist[97, 110] ? creep Fail: (14) [111, 104, 110]hasSublist[97, 110] ? creep Fail: (13) [106, 111, 104, 110]hasSublist[97, 110] ? creep Fail: (12) search(john, an) ? creep Fail: (11) printWay(an, john, [friends, andrew, john]) ? creep Fail: (10) findNodeWay(an, andrew, [john, vikki, annet], [friends, andrew]) ? creep Fail: (9) findNodeWay(an, friends, [andrew, ann], [friends]) ? creep Fail: (8) findWaysInTree(an) ? creep false.
|
Вот тут-то я и не понимаю - почему последний Fail сразу завершает программу ? На всякий случай прикрепил всю программу с исходными данными: http://rgho.st/6Cld9tVV7
|