Слова из файла поместить в 2 списка - Prolog

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток. Помогите решить проблему. Каждая строка текстового файла f2 (вложение №1) состоит из пары слов. Все первые слова поместить в один список, все вторые - в другой. Написал код.
Добавил вывод, чтобы увидеть результат (вложение №2). Конечно, можно после преобразования (предикат preobraz) удалять последний элемент из списка первых слов, но наверно есть другой выход? Как изменить код, чтобы предикат get_all_words1 одинаково корректно работал при обоих его вызовах? Почему этот косяк вообще возникает?

Решение задачи: «Слова из файла поместить в 2 списка»

textual
Листинг программы
goal:-
      see('f2.txt'),
      get_all_words1(L),
      seen,
      preobraz(L, [], LL),
      split(LL, AA, BB),
      write(AA), write(BB).
 
get_word(C1,S):-char_type(C1,white),!,S=[].
get_word(C1,S):-char_type(C1,end_of_line),!,S=[].
get_word(C1,S):-char_type(C1,end_of_file),!,S=[].
get_word(C1,S):-char_code(C1,Code),S=[Code|SS],get_char(CC),get_word(CC,SS).
 
get_all_words1(X):-get_char(C),get_word(C,H),H\=[],!,X=[H|Tail],get_all_words1(Tail).
get_all_words1([]).
 
preobraz([],S,S).
preobraz([Head|Tail],S,SS):-string_to_list(A,Head),append(S,[A],S1),preobraz(Tail,S1,SS).
 
split([H1,H2|T], [H1|T1], [H2|T2]) :-
    !,
    split(T, T1, T2).
split(L, L, []).

Объяснение кода листинга программы

  1. Задача программы - прочитать слова из файла f2.txt и разбить их на два списка: один - с отрицательными словами, другой - со всеми остальными.
  2. Код начинается с функции goal, которая содержит основную логику программы. Функция see('f2.txt') используется для открытия файла и чтения его содержимого.
  3. Функция get_all_words1(L) используется для получения всех слов из содержимого файла и сохранения их в списке L.
  4. Функция preobraz(L, [], LL) используется для предварительной обработки списка L. В данном случае, если список пуст, то он просто возвращает пустой список. Если в списке есть элементы, то они преобразуются в строки и добавляются в новый список LL.
  5. Функция split(LL, AA, BB) используется для разделения списка LL на два списка: AA и BB. В данном случае, список LL разделяется на две части по символу '|'.
  6. Функции get_word(C1,S) и get_char(C) используются для чтения символов из файла и создания слов из этих символов.
  7. Функция get_all_words1(X) используется для рекурсивного получения всех слов из содержимого файла и сохранения их в списке X.
  8. Функция preobraz([],S,S) используется для обработки случая, когда список пуст. В этом случае, он просто возвращает пустой список.
  9. Функция preobraz([Head|Tail],S,SS) используется для обработки случая, когда список не пуст. В этом случае, первый элемент списка (Head) преобразуется в строку и добавляется в новый список S. Затем, рекурсивно вызывается функция preobraz для оставшейся части списка Tail и нового списка S1.
  10. Функция split([H1,H2|T], [H1|T1], [H2|T2]) :- используется для разделения списка T на три списка: H1, H2 и T1. В данном случае, список T разделяется на три части по символу '|'.
  11. Функция split(L, L, []) используется для обработки случая, когда список L пуст. В этом случае, он просто возвращает пустой список.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.846 из 5
Похожие ответы