AI aux salaires minimum 2: Générateur de versets sur Prolog

AI aux salaires minimum 2: Générateur de versets sur Prolog



Image commémorative







L'image montre un quatrain généré par mon programme.







"" , : , , . "" , , , . , , . : " N ", " ", " " .. , . Prolog — , .







Prolog, .







10



. :







, 9

, , 8

, 9

. 8







, 9

, , 8

, 9

. 8







, 9

, 8

, — 9

. 8







: , 9

, 8

, 9

, 8







, , . , : _'_'_'_'_ ( , — ). . , . , , . . , . , .







. , ( ) ( , ).







-. . , . , , :







,

.







:







  1. . .
  2. , .
  3. . .
  4. .
  5. .
  6. !


:







, 7

. 5

, , 7

— . 5







, . "", .







Prolog



, :







  1. , .. .
  2. , .
  3. .


"" , .. , , , ( ).







: , . - . , , Prolog , .. .







Prolog . , — , .. Prolog , . LISP. Prolog .







Prolog , , . () . , , :







().
() :- ().
      
      





Prolog (), (), (). , . , . . Prolog , . , — . " ". :-



.







Prolog ( SWI-Prolog), ?-



. , . socrates.pl [socrates].



,

:







?- ().
true.
      
      





. , :







?- ().
 = .
      
      





Prolog "". .. (closed-world assumption) — , :







?- ().
false.
      
      





, , Prolog false.







", ?" — . , . . fib(n, f_n)



, n - fn :







fib(0, 1).
fib(1, 1).
fib(N, F) :- N #> 1,
             M #= N - 1,
             K #= M - 1,
             F #= G + P,
             fib(M, G),
             fib(K, P).
      
      





, 1. , : " fib(N, F)



, N



, M



N - 1



, K



M - 1



, F



G



P



, fib(M, G)



fib(K, P)



". "". #>



#=



, CLPFD, SWI-Prolog. "" =



, >



.. , REPL ?- use_module(library(clpfd)).









swipl, ?- fib(10, X).



X = 89



. X



, . ';', false



, , X



. : ?- fib(X, 13).



X = 6.



. !







Prolog. ( ) (). : = [ | ]



. , = [1, 2, 3, 4]



, = 1



, = [2, 3, 4]



. . freq(E, L, F)



E



L



F



:







freq(_, [], 0).
freq(Element, [Head|Tail], F) :- Head #= Element,
                     F #= P + 1,
                     freq(Element, Tail, P),
                     !.
freq(Element, [Head|Tail], F) :- Head #\= Element,
                     freq(Element, Tail, F),
                     !.
      
      





: . " " "_". "" , . — . . freq



. ?- freq([1, 2, 2, 3], 2, X)



,



:







X #= X1, Tail = [2, 2, 3]
X1 #= X2 + 1, Tail = [2, 3]
X3 #= X4 + 1, Tail = [3]
X5 #= X6, Tail = []
 : freq(_, [], 0), X6 #= 0.
      
      





X #= 2



.







. .. "cut operator", . " , freq". -



.







Prolog



Prolog . , , . 3 3. , , , . :







A|B|C   2|7|6
-|-|-   -|-|-
D|E|F = 9|5|1
-|-|-   -|-|-
G|H|I   4|3|8
      
      





?







  1. 33 9 .
  2. .
  3. .
  4. 7 , "" .


CLPFD :







magic([A, B, C, D, E, F, G, H, I]) :- Vars = [A, B, C, D, E, F, G, H, I],
                                    Vars ins 1..100,
                                    all_different(Vars),
                                    A + D + G #= B + E + H,
                                    B + E + H #= C + F + I,
                                    C + F + I #= A + B + C,
                                    A + B + C #= D + E + F,
                                    D + E + F #= G + H + I,
                                    G + H + I #= A + E + I,
                                    A + E + I #= C + E + G,
                                    label(Vars).
      
      





magic



9 [1, 100] . label



. ?- magic(S).



33.







: . . :







  1. , .. .
  2. , .
  3. .


, — . . , , , , . , . :







 :    
:    ,    
 :   
:   ,   
      
      





, .







? — :







(, 1).
(, 1).
(, 3).
(, 1).
(, 1).
(, 1).
(, 1).
(, 2).
(, 2).
(, 1).
(, 1).
(, 3).
      
      





. "", , "" . .











:







([, , , ]) :- (, _),
                           (, _),
                           (, _),
                           (, _).
      
      





. ?- ().









. ? , ( — , — , — ). — , . :







(, ).
(, ).
(, ).
(, ).
(, ).
      
      





. , . , " — ", " — " , (, ) — , . , :







  • . . .


:







_(, ).
_(, ).
_(, ).
_(, ).
_(, ).
_(, ).
_(, ).
_(, ).
_(, ).
_(, ).
_(, ).
_(, ).
_(, ).
_(, ).
_(, ).
_(, ).
_(, ).
_(, ).
_(, ).
_(, ).
_(, ).
_(, ).
_(, ).
_(, ).
_(, ).
_(, ).
      
      





"__(1, 2)", 1 2 :







__([], []).
__([1|1], [2|2]) :- 1 = 2, __(1, 2).
__([1|1], [2|2]) :- _(1, 2), __(1, 2).
      
      





: .







, "(1, 2)" :







(1, 2) :- (1, 1),
                     (2, 2),
                     _(1, 1, 1),
                     _(2, 2, 2),
                     atom_chars(1, 1),
                     atom_chars(2, 2),
                     length(1, 1),
                     length(2, 2),
                     1 - 1 #= 2 - 2, %     
                     slice(1, 1, 1, 1),
                     slice(2, 2, 2, 2),
                     __(1, 2),
                     1 \= 2.
      
      





atom_chars



, slice



. : C1 \= C2



, ?- (1, 2).









: . , "" "", "" , "" . "".







, " " "", .. . "".







. . ? , "", "" .







,







"", :







([1, 1, 1, 1], [2, 2, 2], [3, 3, 3, 3], [4, 4, 4], 1, 2, 3, 4) :-
    (1, _),
    (1, _),
    (1, _),
    (1, _),
    _([1, 1, 1, 1], 1),
    (2, _),
    1 \= 2,
    (2, _),
    1 \= 2,
    (2, _),
    1 \= 2,
    _([2, 2, 2], 2),
    (3, _),
    1 \= 3,
    (3, _),
    1 \= 3,
    2 \= 3,
    (3, _),
    2 \= 3,
    1 \= 3,
    (3, _),
    2 \= 3,
    1 \= 3,
    _([3, 3, 3, 3], 3),
    (1, 3),
    (4, _),
    1 \= 4,
    3 \= 4,
    2 \= 4,
    (4, _),
    1 \= 4,
    3 \= 4,
    2 \= 4,
    (4, _),
    1 \= 4,
    3 \= 4,
    2 \= 4,
    _([4, 4, 4], 4),
    (2, 4).

() :- (, , , , , _, , _),  = [, , , ].
      
      





( , , ) X \= Y



.







, ?- ().









?



Il est clair que tout ce qui est décrit n'est qu'une preuve de concept, vous pouvez continuer à développer ce sujet. Par exemple, ajoutez plus de mots au dictionnaire, développez la grammaire pour inclure différents temps et types de mots. Vous pouvez également définir de nouveaux modÚles de poÚmes, différents des classiques, et en effet le champ d'expérimentation est ici trÚs riche.







J'espÚre que vous avez apprécié l'article et appris quelque chose de nouveau. Lien vers le référentiel du projet: prolog-poetry . Il existe également une instruction de lancement complÚte.








All Articles