Je vais peut-être commencer par vous présenter le lecteur de cet article, car rien n’attire plus l’attention sur le texte que l’empathie pour le personnage principal, d’autant que vous jouez désormais son rôle. Probablement, après avoir entendu ou lu une fois l'expression «programmation logique» et rempli d'intérêt, vous, en tant que programmeur actuel ou futur, êtes allé chez Google. Le premier lien, bien sûr, mène à Wikipedia - lisez la définition:
La programmation logique est un paradigme de programmation basé sur la démonstration automatique de théorèmes, ainsi qu'une section de mathématiques discrètes qui étudie les principes de l'inférence logique d'informations basées sur des faits et des règles d'inférence donnés. La programmation logique est basée sur la théorie et l'appareil de la logique mathématique utilisant les principes mathématiques des résolutions.
"Hmm" - vous pensez, et cela dit tout. Compliqué! Et ici notre brave héros aurait dû suivre le deuxième lien, mais je vais me permettre de faire un petit insert, décrivant le personnage principal: Vous , selon mon idée, êtes un débutant en programmation , et même si non, vous n'êtes certainement pas familier avec son apparence logique ... Si le lecteur est déjà un peu (ou même beaucoup) tenté par les connaissances dans ce domaine, je vous recommande de lire l'article Qu'est-ce que la programmation logique et pourquoi nous en avons besoin , puisque vous avez un intérêt et une curiosité pour le sujet, et laissez l'étude du matériel ci-dessous à des collègues moins expérimentés.
Il est donc temps pour le deuxième lien. Qu'est-ce qu'il serait? Article sur Habré? Peut-être un article sur une autre ressource? Après avoir lu les deux premiers paragraphes sur différents sites, vous ne comprendrez probablement pas grand-chose, car, d'une part, le matériel est généralement destiné à un lecteur averti, et d'autre part, il n'y a pas tant d'informations bonnes et compréhensibles sur le sujet sur l'Internet russophone, en troisièmement, pour une raison quelconque, il est toujours question d'un "prologue" (on parle bien sûr du langage de programmation Prolog), mais le langage lui-même semble être utilisé par très peu de personnes (honorable 35e place dans la note TIOBE ). Cependant, notre héros ne perd pas sa motivation et, au bout d'un moment, tombe sur cet article même, voulant encore comprendre:
Qu'est-ce que la programmation logique
, , .
, , 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-
, :
- , , , , - . , ( , ) , , .
- , . -, - ( , , ). -, , , . -, , , . -, , , .
Et ici, il ne reste plus qu'à souhaiter une 2021 productive !