Saya akan mulai, mungkin, dengan memperkenalkan pembaca artikel ini, karena tidak ada yang lebih menarik perhatian ke teks selain empati untuk karakter utama, terutama karena Anda sekarang memainkan perannya. Mungkin, setelah mendengar atau membaca satu kali frase "pemrograman logika" dan penuh dengan minat, Anda, sebagai programmer sekarang atau masa depan, pergi ke Google. Tautan pertama, tentu saja, mengarah ke Wikipedia - baca definisinya:
Pemrograman logika adalah paradigma pemrograman berdasarkan pembuktian teorema otomatis, serta bagian dari matematika diskrit yang mempelajari prinsip-prinsip inferensi logis informasi berdasarkan fakta dan aturan inferensi yang diberikan. Pemrograman logika didasarkan pada teori dan peralatan logika matematika menggunakan prinsip-prinsip matematika dari resolusi.
"Hmm" - menurut Anda, dan itu menjelaskan semuanya. Rumit! Dan di sini pahlawan pemberani kita seharusnya mengikuti tautan kedua, tetapi saya akan membiarkan diri saya membuat sisipan kecil, menggambarkan karakter utama: Anda , menurut ide saya, adalah pemula dalam pemrograman , dan bahkan jika tidak, maka Anda pasti tidak terbiasa dengan tampilan logisnya ... Jika pembaca sudah agak (atau bahkan banyak) tergoda dengan pengetahuan di bidang ini, maka saya sarankan membaca artikel Apa itu pemrograman yang logis dan mengapa kita membutuhkannya , karena Anda memiliki minat dan keingintahuan tentang topik tersebut, dan serahkan kajian materi di bawah ini kepada rekan-rekan yang kurang berpengalaman.
Jadi sudah waktunya untuk tautan kedua. Akan apa? Artikel tentang Habré? Mungkin artikel di sumber lain? Setelah membaca beberapa paragraf pertama di situs yang berbeda, Anda kemungkinan besar tidak akan mengerti banyak, karena, pertama, materi biasanya ditujukan untuk pembaca yang berpengetahuan luas, dan kedua, tidak ada banyak informasi yang baik dan dapat dipahami tentang topik di Internet berbahasa Rusia, di- ketiga, untuk beberapa alasan selalu ada pertanyaan tentang "prolog" (kita berbicara tentang bahasa pemrograman Prolog, tentu saja), tetapi bahasa itu sendiri tampaknya digunakan oleh sangat sedikit orang (peringkat terhormat ke-35 dalam peringkat TIOBE ). Namun, pahlawan kita tidak kehilangan motivasi dan, setelah beberapa saat, tersandung pada artikel ini, namun tetap ingin memahami:
Apa itu Pemrograman Logika
, , .
, , 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-
, :
- , , , , - . , ( , ) , , .
- , . -, - ( , , ). -, , , . -, , , . -, , , .
Dan di sini tinggal berharap 2021 yang produktif !