Ich beginne vielleicht mit der Präsentation des Lesers dieses Artikels, da nichts mehr Aufmerksamkeit auf den Text lenkt als Empathie für die Hauptfigur, zumal Sie jetzt seine Rolle spielen. Nachdem Sie den Ausdruck "Logikprogrammierung" einmal gehört und gelesen und mit Interesse gefüllt hatten, sind Sie als gegenwärtiger oder zukünftiger Programmierer wahrscheinlich zu Google gegangen. Der erste Link führt natürlich zu Wikipedia - lesen Sie die Definition:
Die logische Programmierung ist ein Programmierparadigma, das auf automatischen Theoremprüfungen basiert, sowie ein Abschnitt der diskreten Mathematik, der die Prinzipien der logischen Inferenz von Informationen auf der Grundlage gegebener Fakten und Inferenzregeln untersucht. Die Logikprogrammierung basiert auf der Theorie und dem Apparat der mathematischen Logik unter Verwendung der mathematischen Prinzipien von Auflösungen.
"Hmm" - du denkst, und das sagt alles. Kompliziert! Und hier hätte unser tapferer Held dem zweiten Link folgen sollen, aber ich werde mir erlauben, eine kleine Beilage zu machen, die die Hauptfigur beschreibt: Sie sind meiner Idee nach ein Anfänger in der Programmierung , und selbst wenn nicht, dann sind Sie mit ihrer logischen Erscheinung definitiv nicht vertraut ... Wenn der Leser bereits etwas (oder sogar viel) mit Kenntnissen auf diesem Gebiet versucht ist, empfehle ich, den Artikel Was ist logische Programmierung und warum wir sie brauchen , zu lesen , da Sie ein Interesse und eine Neugier für das Thema haben und das Studium des folgenden Materials weniger erfahrenen Kollegen überlassen.
Es ist also Zeit für den zweiten Link. Was wird es sein? Artikel über Habré? Vielleicht ein Artikel über eine andere Ressource? Nachdem Sie die ersten Absätze auf verschiedenen Websites gelesen haben, werden Sie höchstwahrscheinlich nicht viel verstehen, da sich das Material zum einen in der Regel an einen sachkundigen Leser richtet und zum anderen im russischsprachigen Internet nicht so viele gute und verständliche Informationen zum Thema Drittens handelt es sich aus irgendeinem Grund immer um einen "Prolog" (wir sprechen natürlich über die Programmiersprache Prolog), aber die Sprache selbst scheint nur von sehr wenigen verwendet zu werden (ehrenwerter 35. Platz in der TIOBE- Bewertung ). Unser Held verliert jedoch nicht die Motivation und stößt nach einer Weile auf genau diesen Artikel, um noch zu verstehen:
Was ist Logikprogrammierung?
(, ?)
, , .
, , 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-
, :
- , , , , - . , ( , ) , , .
- , . -, - ( , , ). -, , , . -, , , . -, , , .
Und hier bleibt nur noch ein produktives 2021 zu wünschen !