Advertisement
Guest User

Untitled

a guest
Apr 19th, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Prolog 3.54 KB | None | 0 0
  1. /****************************************/
  2. %         lire_question(LMots)          */
  3. %   Entrée : question de l'utilisateur  */
  4. /****************************************/
  5.  
  6. lire_question(LMots) :- convPhrLst(LMots).
  7.  
  8. % convPhrLst(-ListOfAtomics)
  9. %  Lit l'entrée (read_...), supprime les ponctuations (clean_...)
  10. %  et la convertit en une liste de termes atomiques (extract_...)
  11.  
  12. convPhrLst(ListOfAtomics) :-
  13.     lectChaine(Str),
  14.     nettChaine(Str, SStr),
  15.     extraireAtomiques(SStr, ListOfAtomics).
  16.  
  17. % lectChaine(-Chn)                                          ---- VERIFIEE ----
  18. %  Lit le premier caractère d'une chaîne,
  19. %  met le caractère en minuscule et vérifie
  20. %  si ce n'est pas un caractère spécial (\n ou [EF] par ex)
  21.  
  22. lectChaine(Str) :-
  23.     get0(Ltr),
  24.     enMinuscule(Ltr, LLtr),
  25.     lectSymboles(LLtr, Str).
  26.  
  27. enMinuscule(X, X).
  28. enMinuscule(X, Y) :-
  29.     X >= 65,
  30.     X =< 90,
  31.     Y is X + 32, !.
  32.  
  33. lectSymboles(10, []) :- !.  % 10 = Retour à la ligne.
  34. lectSymboles(-1, []) :- !.  % -1 = Caractères ASCII inconnus.
  35. lectSymboles(LLtr, [LLtr|Reste]) :- lectChaine(Reste).
  36.  
  37. % nettChaine/2                                              ---- VERIFIEE ---
  38. % Lit le type du premier caractère
  39. % et le supprime si c'est un symbole de ponctuation.
  40.  
  41. nettChaine([L|Str], SStr) :-
  42.     estDeType(L, punctuation),
  43.     nettChaine(Str, SStr), !.
  44.  
  45. nettChaine([L|Str], [L|SStr]) :-
  46.     nettChaine(Str, SStr), !.
  47.  
  48. nettChaine([L|[]], []) :-
  49.     estDeType(L, punctuation), !.
  50.  
  51. nettChaine([L|[]], [L]).
  52.  
  53. estDeType(46, period) :- !.                         % . (point)
  54. estDeType(X, alphabetic) :- X >= 65, X =< 90, !.    % [A-Z]
  55. estDeType(X, alphabetic) :- X >= 97, X =< 123, !.   % [a-z]
  56. estDeType(X, numeric) :- X >= 48, X =< 57, !.       % [0-9]
  57. estDeType(X, whitespace) :- X =< 32, !.
  58. estDeType(X, punctuation) :- X >= 33, X =< 47, !.
  59. estDeType(X, punctuation) :- X >= 58, X =< 64, !.
  60. estDeType(X, punctuation) :- X >= 91, X =< 96, !.
  61. estDeType(X, punctuation) :- X >= 123, X =< 126, !.
  62. estDeType(_, special).
  63.  
  64. % extraireAtomiques/2                                       ---- VERIFIEE ----
  65. % Supprime les espaces et
  66. % extrait les mots de la chaîne en les plaçant dans une liste.
  67.  
  68. extraireAtomiques(SStr, ListOfAtomics) :-
  69.     suppBlancs(SStr, SSStr),
  70.     extraireAtomiquesAux(SSStr, ListOfAtomics).
  71.  
  72. suppBlancs(X, X).
  73. suppBlancs([C|LChar], Str) :-
  74.     estDeType(C, whitespace), !,
  75.     suppBlancs(LChar, Str).
  76.  
  77. extraireAtomiquesAux([],[]).
  78. extraireAtomiquesAux([C|LChar], [A|LAtomic]) :-
  79.     extraireMot([C|LChar], Rest, Word),
  80.     chaineVersAtomique(Word, A),
  81.     extraireAtomiques(Rest, LAtomic).
  82.  
  83. % Déf. d'un mot :
  84. % Suite continue de caractères de même type !
  85. % Ex : 12345 est un mot, abcde est un mot, mais pas a123b !
  86. extraireMot([C|Chars], Rest, [C|RestOfWord]) :-
  87.     estDeType(C, Type),
  88.     extraireMotAux(Type, Chars, Rest, RestOfWord).
  89.  
  90. extraireMotAux(special, Rest, Rest, []) :- !.
  91.    % if Char is special, don't read more chars.
  92.  
  93. extraireMotAux(Type, [C|Chars], Rest, [C|RestOfWord]) :-
  94.     estDeType(C, Type), !,
  95.     extraireMotAux(Type, Chars, Rest, RestOfWord).
  96.  
  97. extraireMotAux(_, Rest, Rest, []).
  98.  
  99. chaineVersAtomique([C|Chars],Number) :-
  100.     chaineVersNombre([C|Chars],Number), !.
  101.  
  102. chaineVersAtomique(String,Atom) :- name(Atom,String).
  103.  
  104. chaineVersNombre(S,N) :-
  105.     chaineVersNombreAux(S,0,N).
  106.  
  107. chaineVersNombreAux([], Result, Result).
  108. chaineVersNombreAux([D|Digits],ValueSoFar,Result) :-
  109.     digit_value(D,V),
  110.     NewValueSoFar is 10*ValueSoFar + V,
  111.     chaineVersNombreAux(Digits,NewValueSoFar,Result).
  112.  
  113. digit_value(48,0).
  114. digit_value(49,1).
  115. digit_value(50,2).
  116. digit_value(51,3).
  117. digit_value(52,4).
  118. digit_value(53,5).
  119. digit_value(54,6).
  120. digit_value(55,7).
  121. digit_value(56,8).
  122. digit_value(57,9).
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement