Ответ в теме: Удвоить одиночные символы в строке на Prolog

      Комментарии к записи Ответ в теме: Удвоить одиночные символы в строке на Prolog отключены
#1797

На Visual Prolog:

domains
  list=char*
predicates
  str_list(string, list)
  list_str(list,string)
  rm_single(list, list, list)
  member(char, list)
clauses
  str_list("",[]):-!.
  str_list(S1,[H|T]):-
    frontchar(S1,H,Str1), str_list(Str1,T).
      
  list_str([],""):-!.
  list_str([H|T],S):-
    list_str(T,S1),frontchar(S,H,S1).
     
  member(H, [H|_]):-!.
  member(E, [_|T]):-
    member(E, T).
     
  rm_single([], _Buffer, []):-!.
  rm_single([Head|Tail], Buffer, [Head|TailResult]):-
    member(Head, Tail), !, rm_single(Tail, [Head|Buffer], TailResult);
    member(Head, Buffer), !, rm_single(Tail, [Head|Buffer], TailResult).
  rm_single([Head|Tail], Buffer, [Head,Head|TailResult]):-
    rm_single(Tail, [Head|Buffer], TailResult).
  
goal
  write("Enter string :"),nl,
  readln(S),
  str_list(S, L),
  rm_single(L, [], List),
  list_str(List, Str),
  write("S=", Str).

Тут предикаты list_str и str_list эквивалентны стандартной функции string_to_list из SWI Prolog. Написаны потому, что в Turbo Prolog и Visual Prolog нет таких стандартных функций.