最低給与でのAI2:Prologの詩の生成者

最低給与でのAI2:Prologの詩の生成者



記念写真







写真は私のプログラムによって生成されたquatrainを示しています。







"" , : , , . "" , , , . , , . : " 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



.







, ?- ().









?



説明されているすべてが概念実証にすぎないことは明らかです。このトピックを引き続き開発できます。たとえば、辞書に単語を追加したり、文法を拡張してさまざまな時制や単語の種類を含めたりします。古典とは異なる新しい詩のパターンを定義することもできます。実際、ここでは実験の分野が非常に豊富です。







この記事を楽しんで、何か新しいことを学んだことを願っています。プロジェクトリポジトリリンク:prolog-poetry完全な起動手順もあります。








All Articles