Empezaré, quizás, por presentar al lector de este artículo, ya que nada llama más la atención sobre el texto que la empatía por el protagonista, sobre todo porque ahora estás interpretando su papel. Probablemente, habiendo escuchado o leído una vez la frase "programación lógica" y lleno de interés, usted, como programador presente o futuro, fue a Google. El primer enlace, por supuesto, conduce a Wikipedia; lea la definición:
La programación lógica es un paradigma de programación basado en la demostración automática de teoremas, así como una sección de matemáticas discretas que estudia los principios de inferencia lógica de información basada en hechos y reglas de inferencia dados. La programación lógica se basa en la teoría y el aparato de la lógica matemática utilizando los principios matemáticos de las resoluciones.
"Hmm" - piensas, y eso lo dice todo. ¡Complicado! Y aquí nuestro valiente héroe debería haber seguido el segundo enlace, pero me permitiré hacer un pequeño inserto, describiendo al personaje principal: Tú , según mi idea, eres un principiante en programación , e incluso si no, definitivamente no estás familiarizado con su apariencia lógica. ... Si el lector ya está algo (o incluso mucho) tentado por el conocimiento en esta área, entonces recomiendo leer el artículo Qué es la programación lógica y por qué la necesitamos , ya que tienes interés y curiosidad por el tema, y dejas el estudio del material a continuación a colegas menos experimentados.
Entonces es hora del segundo enlace. ¿Qué será? ¿Artículo sobre Habré? ¿Quizás un artículo sobre otro recurso? Después de leer el primer par de párrafos en diferentes sitios, lo más probable es que no entienda mucho, ya que, en primer lugar, el material generalmente está dirigido a un lector experto y, en segundo lugar, no hay tanta información buena y comprensible sobre el tema en Internet de habla rusa, en En tercer lugar, por alguna razón, siempre hay un "prólogo" (estamos hablando del lenguaje de programación Prolog, por supuesto), pero el lenguaje en sí parece ser utilizado por muy pocas personas (honorable 35º lugar en la clasificación TIOBE ). Sin embargo, nuestro héroe no pierde la motivación y, después de un tiempo, se topa con este mismo artículo, queriendo entender aún:
¿Qué es la programación 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-
, :
- , , , , - . , ( , ) , , .
- , . -, - ( , , ). -, , , . -, , , . -, , , .
¡Y aquí solo queda desear un 2021 productivo !