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

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

Помечено: , ,

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

Просмотр 4 сообщений - с 1 по 4 (из 4 всего)
  • Автор
    Сообщения
  • #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 и строки обрабатываются как списки (посмотрите на пример выше, чем он не подошел?).

Просмотр 4 сообщений - с 1 по 4 (из 4 всего)

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