Поиск:

Ответ в темуСоздание новой темы Создание опроса
> SWI - Как победить Fail ? Поведение программы 
:(
    Опции темы
eloiss
Дата 18.4.2017, 07:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 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
PM MAIL   Вверх
eloiss
Дата 18.4.2017, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 7.5.2009

Репутация: нет
Всего: нет



Нет ни у кого никаких идей ? 

Хотя бы как еще можно сделать фильтрацию атомов если не использовать поиск подсписка в списке ?
PM MAIL   Вверх
eloiss
Дата 19.4.2017, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 7.5.2009

Репутация: нет
Всего: нет



Проблема решена. Можно закрыть тему.
PM MAIL   Вверх
Google
  Дата 28.4.2017, 13:18 (ссылка)  





  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума Prolog
Void
  • Пожалуйста, создавайте темы с содержательными названиями.
  • Уважаемые учащиеся, здесь всегда рады помочь Вам, но не делать за Вас вашу работу. У вас гораздо больше шансов получить помощь, если Вы приложите усилия и поделитесь с нами проблемами и результатами. В противном случае добро пожаловать в раздел Центр Помощи.
  • Получив ответ на интересующий Вас вопрос, не забудьте пометить его как решённый.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Void.

 
2 Пользователей читают эту тему (2 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Prolog | Следующая тема »


 




[ Время генерации скрипта: 0.0838 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.