O papel da programação lógica, e vale a pena planejar estudá-la em 2021

Começarei, talvez, apresentando o leitor deste artigo, pois nada atrai mais a atenção para o texto do que empatia pelo protagonista, até porque você agora está desempenhando o papel dele. Provavelmente, tendo ouvido ou lido uma vez a frase "programação lógica" e cheio de interesse, você, como atual ou futuro programador, foi ao Google. O primeiro link, é claro, leva à Wikipedia - leia a definição:





A programação lógica é um paradigma de programação baseado em prova automática de teoremas, bem como uma seção de matemática discreta que estuda os princípios de inferência lógica de informações com base em fatos dados e regras de inferência. A programação lógica é baseada na teoria e no aparato da lógica matemática usando os princípios matemáticos das resoluções.





"Hmm" - você pensa, e isso diz tudo. Complicado! E aqui nosso bravo herói deveria ter seguido o segundo link, mas me permitirei fazer um pequeno encarte, descrevendo o personagem principal: Você , na minha ideia, é um iniciante em programação e, mesmo que não, definitivamente não está familiarizado com sua aparência lógica ... Se o leitor já está um pouco (ou até muito) tentado com conhecimento nesta área, recomendo a leitura do artigo O que é programação lógica e por que precisamos , já que você tem interesse e curiosidade pelo assunto, e deixe o estudo do material abaixo para colegas menos experientes.





Então é hora do segundo link. O que será? Artigo sobre Habré? Talvez um artigo sobre outro recurso? Depois de ler os primeiros parágrafos em sites diferentes, você provavelmente não entenderá muito, já que, em primeiro lugar, o material é geralmente destinado a um leitor experiente e, em segundo lugar, não há tantas informações boas e compreensíveis sobre o assunto na Internet falante de russo, in- Em terceiro lugar, por alguma razão, sempre há um "prólogo" (estamos falando da linguagem de programação Prolog, é claro), mas a linguagem em si parece ser usada por muito poucas pessoas (honroso 35º lugar na classificação TIOBE ). No entanto, nosso herói não perde a motivação e, depois de um tempo, tropeça neste mesmo artigo, querendo ainda entender:





  • O que é programação lógica





  • (, ?)













, , .





, , Pascal ( - ). Python, C/C++/C#, Java. , , - :






1
2
 
  3

  4

      
      



, , , , () . , . , , . , , , , . , , , , , … ?





:





.





- .





, .





. ? ! Prolog-e, . , Prolog () . , "" , .





, , ( ) " ":





% ,       - 
human('Plato'). %  - 
human('Socrates'). %  -  
human('Aristotle'). % ,    
% ... . 

mortal(X) :- human(X). %  : "X ,  X - "
      
      



, , :





?- mortal('Socrates').
true.
      
      



"true", , , , - .





, , . . . , . , , - . "human('Socrates')." ? "human" "mortal" - . , , , .





. ( ) , ( (true) (false)). - .





%     Prolog  ,      
like('Petya', 'Milk'). %  ,    
good('Kesha'). %  
number_of_sides('Triangle', 3). %    

like('Misha', X). %   ,     X  
      
      



. "mortal(X) :- human(X).". - , (/) . :





a(X,Y,Z) :- b(X), c(Y,Z), d().
      
      



a , b, c d. : " b X c X, Y d , a X, Y, Z ".





, , . , . , , -:





%     ,         
eat(father, cheese).
eat(father, apple).
eat(father, melon).
eat(mother, meat).
eat(sister, meat).
eat('Petya', cheese).
eat(brother, orange).
      
      



( ):





?- eat(father, apple). %    
true.

?- eat(father, meat).  %    
false.

?- eat(sister, X). %   
X = meat.

?- eat(X, cheese). %   
X = father ;
X = 'Petya'.

?- eat(X, Y). %   
X = father,
Y = cheese ;
X = father,
Y = apple ;
X = father,
Y = melon ;
X = mother,
Y = meat ;
X = sister,
Y = meat ;
X = 'Petya',
Y = cheese ;
X = brother,
Y = orange.
      
      



, . , ( ) . , , , .





( , ) , . , , , . , :





d(X,X,1) :- !. %  X  X = 1
d(T,X,0) :- atomic(T). %   = 0
d(U+V,X,DU+DV) :- d(U,X,DU), d(V,X,DV). %   =  
d(U-V,X,DU-DV) :- d(U,X,DU), d(V,X,DV). 
d(-T,X,-R) :- d(T,X,R).
d(C*U,X,C*W) :- atomic(C), C\=X, !, d(U,X,W). %  ,    =     
d(U*V,X,Vd*U+Ud*V) :- d(U,X,Ud), d(V,X,Vd). %  
d(U/V,X,(Ud*V-Vd*U)/(V*V)) :- d(U,X,Ud), d(V,X,Vd). 
      
      



:





?- d((x-1)/(x+1),x,R).   
R =  ((1-0)*(x+1)-(1+0)*(x-1))/((x+1)*(x+1)).
      
      



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





, , , .





speciality(X,tech_translator) :- studied_languages(X), studied_technical(X). % X -  ,      
speciality(X,programmer) :- studied(X,mathematics), studied(X, compscience). % X - ,      
speciality(X,lit_translator) :- studied_languages(X), studied(X,literature). % X -  ,   
studied_technical(X) :- studied(X,mathematics). % X   ,   
studied_technical(X) :- studied(X,compscience). % ...  
studied_languages(X) :- studied(X,english). % X  ,   
studied_languages(X) :- studied(X,german). % ... 

studied(petya,mathematics). %   
studied(petya,compscience). % ... 
studied(petya,english). % ... 
studied(vasya,german). %   
studied(vasya,literature). %... 
      
      



, , - :





?- speciality(X,tech_translator).
X = petya ;
X = petya ;
false.
      
      



… , … - , . , X, :





, , . , , - , false. , , -, . , , - . "" , :





, ( ), . , ("" ). ( ). , 1, , . ., (). ? , . :





% : w -  , b - , e -  
is_ball(w). % w - 
is_ball(b). % b - 

near([X,e|T],[e,X|T]) :- is_ball(X). %      ,   
near([e,X|T],[X,e|T]) :- is_ball(X).
jump([X,Y,e|T],[e,Y,X|T]) :- is_ball(X), is_ball(Y). %       ,   
jump([e,Y,X|T],[X,Y,e|T]) :- is_ball(X), is_ball(Y).

%  .      ,       
move(L1,L2) :- near(L1,L2). 
move(L1,L2) :- jump(L1,L2).
move([X|T1],[X|T2]) :- move(T1,T2).

%    .    X     Y 
% Y     ,  Y -  
prolong([X|T],[Y,X|T]) :- move(X,Y), not(member(Y,[X|T])).

%   -  ,  -  ,  - ,    
bdth([[X|T]|_],X,R) :- reverse([X|T], R). %     ,        (   ,    )
bdth([P|QI],Y,R) :- bagof(Z,prolong(P,Z),T), append(QI,T,QO), !, bdth(QO,Y,R). %          ,   
bdth([_|T],Y,R) :- bdth(T,Y,R). %       ,   bagof  false,     
bsearch(X,Y,R) :- bdth([[X]],Y,R). %     bdth

% ,             
solve :- bsearch([w,w,w,e,b,b,b],[b,b,b,e,w,w,w],P), write(P), nl, length(P, Len), write(Len), nl.
      
      



solve, , , - . ( ) , , . - , ( ()) . . , , ( ) . , , .





. , ? : . , , . : , 1, 2, 4 . . :





%   -  ,  -  ,  - ,    
dpth_id([X|T],X,R,0) :- reverse([X|T], R). %   
dpth_id(P,Y,R,N) :- N > 0, prolong(P,P1), N1 is N - 1, dpth_id(P1,Y,R,N1). %   >0,       
generator(1). %    1
generator(N) :- generator(M), N is M + 1. %   2, 3, 4  . .
isearch(X,Y,R) :- generator(D), dpth_id([X],Y,R,D). %  ,         .
      
      



-, , , ( reverse, ). , ( ). -, "" , , ( , ), . -, - , . , , : 16.





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





near([w,e|T],[e,w|T]).
near([e,b|T],[b,e|T]).
jump([w,X,e|T],[e,X,w|T]) :- is_ball(X).
jump([e,X,b|T],[b,X,e|T]) :- is_ball(X).
      
      



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





, .





  • : - . , , , , , , . , , . , . , . , . , " ", " ?" , , " ". - , , "" ( , , ). , . . .





  • : , - . , , ( ). . , , ( , , ).





  • -: , , . , . , . . , , , IT . - , -, , - . , , . .





, , ( , ). , ( ) . Prolog-. , , ( ), , ( . . ), : , , .





2021-

, :





  • - , , , , - . , ( , ) , , .





  • - , . -, - ( , , ). -, , , . -, , , . -, , , .





E aqui resta apenas desejar um 2021 produtivo !








All Articles