Список символов, которые входят в обе строки

      Комментарии к записи Список символов, которые входят в обе строки отключены

Главная Форумы Программирование Помощь с решением задач на Prolog Задачи на строки и файлы Список символов, которые входят в обе строки

В этой теме 3 ответа, 2 участника, последнее обновление  Васильев Владимир Сергеевич 2 года/лет, 6 мес. назад.

  • Автор
    Сообщения
  • #1757

    questioner
    Участник

    Нужен предикат, который составит список символов, входящих одновременно в обе исходных строки (пересечение строк). Например:

    Str1 = "string example",
    Str2 = "another",
    intersect(Str1, Str2, Intersect).
    % Intersect = [a, n, t, e, r]

  • #1758

    От первой строки постепенно отделяете символы, ищите их во второй строке. Если находите — добавляете в третью строку.
    Решение будет зависеть от диалекта пролога, например на SWI Prolog вы можете использовать стандартный предикат member для поиска:

    intersect("", _Str2, ""):-!.
    intersect([Head|Tail], Str2, [Head|IntersectTail]):-
      member(Head, Str2), !, intersect(Tail, Str2, IntersectTail).
    intersect([_Head|Tail], Str2, IntersectTail):-
      intersect(Tail, Str2, IntersectTail).

    Если первая строка пуста, то результатом ее пересечения с любой строкой будет пустая строка. В противном случае от первой строки отделяется первый символ, выполняется его поиск во второй строке. Если совпадение найдено, то символ добавится к результату рекурсивной обработки хвоста, иначе — будет пропущен.

    • #1759

      questioner
      Участник

      domains
        str=string
        list=char*
      Predicates
        str_pos(char,str,integer)
        append(list,list,list)
        check(str,str,list,list)
      Clauses
        append([ ], L, L).
        append([H|T], L, [H|T1]) :-append(T,L,T1).
       
        str_pos(C,S,1):-
          frontchar(S,C,_),!.             
        str_pos(C,S,N) :-
          frontchar(S,_,S1),
          str_pos(C,S1,N1),
          N1<>0,!,N=N1+1.
        str_pos(_,_,0).
       
        check("",_,M,M):-!.
        check(S,S1,L,List):-
          frontchar(S,H,T),
          str_pos(H,S1,R),R<>0,
          append(L,[H],L1),
          check(T,S1,L1,List).
        check(S,S1,L,List):-
          frontchar(S,_,T),
          check(T,S1,L,List).

      Посмотрите пожалуйста. Я пытаюсь портировать этот код в SWI Prolog, а он ни в какую работать не хочет.

      • #1760

        str_pos возвращает позицию символа в строке или 0, если символ не найден, он точно работает? — проверьте его отдельно.
        Что вы делаете в check мне не понятно совсем.

        Насколько я помню, вы SWI пролог решили использовать. В SWI Prolog нет frontchar и строки обрабатываются как списки (посмотрите на пример выше, чем он не подошел?).

Для ответа в этой теме необходимо авторизоваться.