Programación lógica en Prolog para principiantes

Prolog es el lenguaje de programación lógica más popular
Prolog es el lenguaje de programación lógica más popular

En este articulo:





  1. Aprenderemos qué es la programación lógica ( LP ) y sus áreas de aplicación.





  2. Instale el lenguaje LP más popular : Prolog





  3. Aprenda a escribir programas simples en Prolog





  4. Listas de aprendizaje en Prolog





  5. Echemos un vistazo a las ventajas y desventajas de Prolog.





Este artículo será útil para quienes:





  1. Está interesado en enfoques inusuales y amplía sus horizontes.





  2. Empieza a estudiar Prolog (por ejemplo, en el instituto)





, . , Prolog, . . .





. — !





. :





  • ( ). . , . : C/C++, Java, C#, Python, Golang, , . , . — .





  • (). , . : Haskell, F#, . . . — . , . .





  • — (). . : Prolog , Mercury. , . , , , " ", " ", " , , , ", " - , ".





    . , Prolog (PROgramming in LOGic). . . , - . , .





Prolog

() : SWI Prolog, Visual Prolog, GNU Prolog. SWI Prolog.





Arch Linux:





sudo pacman -S swi-prolog
      
      



Ubuntu:





sudo apt install swi-prolog
      
      



Prolog . SWI Prolog. swi-prolog, swipl:





[user@Raft ~]$ swipl
Welcome to SWI-Prolog (threaded, 64 bits, version 8.2.3)
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software.
Please run ?- license. for legal details.

For online help and background, visit https://www.swi-prolog.org
For built-in help, use ?- help(Topic). or ?- apropos(Word).

?- 
      
      



! !





Windows.

. . . 64 . . , . .





Sitio web de SWI Prolog: instaladores de la última versión estable
SWI Prolog -
No toque las casillas de verificación
Estoy buscando SWI-Prolog a través de la búsqueda de Windows.  Corriendo
SWI-Prolog Windows.
¡Hurra!  Ahora todo funciona en Windows
! Windows

Prolog. , ,

, :





  • (, )





  • (, , , )





  • (, , )









"predicate" " ".





: , , , , , , , , , , , , , , .

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





! . :





  1. , simple.pl (.pl — )









  2. SWI Prolog









simple.pl:





study(mark, book).
      
      



. :





[user@Raft referat]$ swipl simple.pl 
Welcome to SWI-Prolog (threaded, 64 bits, version 8.2.3)
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software.
Please run ?- license. for legal details.

For online help and background, visit https://www.swi-prolog.org
For built-in help, use ?- help(Topic). or ?- apropos(Word).

?- 
      
      



Windows notepad++ . SWI-Prolog consult.





Vemos que ha recopilado las condiciones.  Incluso escribí "cláusulas 1", es decir, un hecho
, . "1 clauses", .

? (, simple.pl) . : , SWI Prolog . . ( , "?- ". , , )





" ?" :





?- study(mark, book).
true.

?- 
      
      



" study(mark, study) ?", "true." . , " ?"





?- study(mark, book).
true.

?- study(mark, docs).
false.

?- 
      
      



"false.". , .





. , .





%   .   11 .
%     ".",    ,   .
%    "%".
%     .
/*  


*/

% . 11 
study(mark, book). %   
study(mark, studentbook). %   
study(mark, docs). %   

see(masha, mouse). %   
see(masha, book). %   
see(masha, notebook). %   
see(masha, mark). %   

study(misha, math). %   
study(misha, lp). %   
study(misha, docs). %   
study(misha, studentbook). %   
      
      



. (, ""). :





  1. . . . : 1,36, 0, -1, 123.4, 0.23E-5. — : a, abc, neOdinSimvol, sTROKa. , , . : ' , . Eto kirilicca'.





  2. . : X, Y, Z, Peremennaya, Var.





  3. ( ). , study(misha, lp).





  4. . : [X1], [Head|Tail]. .





    , . , .





. .





study(mark, book). — . . , . , .





" " . : ?- study(mark, book). , true, , false. , , .





. , mark. "study(mark, X)." "Enter",





?- study(mark, X).
X = book .
      
      



, ";".





?- study(mark, X).
X = book ;
X = studentbook ;
X = docs.
      
      



, .





?- study(Who, docs).
Who = mark ;
Who = misha.
      
      



, !





?- study(Who, Object).
Who = mark,
Object = book ;
Who = mark,
Object = studentbook ;
Who = mark,
Object = docs ;
Who = misha,
Object = math ;
Who = misha,
Object = lp ;
Who = misha,
Object = docs ;
Who = misha,
Object = studentbook.
      
      



Who Object, study(Who, Object) .





. old.pl





%  
older(sasha, lesha). %   
older(misha, sasha). %   
older(misha, dasha). %   
older(masha, misha). %   

%  
older(X,Y) :- older(X, Z), older(Z,Y).

% X  Y,  X  Z  Z  Y
% X, Y, Z -  .     ,
%     .
% :   ,        
      
      



older(X,Y) :- older(X, Z), older(Z,Y) — . . , , older(X,Z) older(Z,Y) . , "X Y, X Z Z Y"





"," "". : "0 < X, X < 5". X 5 0.

";" "". "X < 0; X > 5". X 0 5.

"not(- )" "". "not(X==5)". X 5.





, . ( )





, .





?- older(masha, X).
X = misha.
      
      



. . .. " ?". , , . . older(X,Y) :- older(X, Z), older(Z,Y).

.





?- older(masha, X).
X = misha ;
X = sasha ;
X = dasha ;
X = lesha ;
ERROR: Stack limit (1.0Gb) exceeded
ERROR:   Stack sizes: local: 1.0Gb, global: 21Kb, trail: 1Kb
ERROR:   Stack depth: 12,200,525, last-call: 0%, Choice points: 6
ERROR:   Probable infinite recursion (cycle):
ERROR:     [12,200,525] user:older(lesha, _5658)
ERROR:     [12,200,524] user:older(lesha, _5678)
?- 
      
      



. ? ! ! , ? , . — older(masha,X) , — . ?





. , , , . older(X, Y) older(X,Z), older ...

- . , "older(X, Z)" ? , older(X, Y) (, ).

, older(Z, Y), older(X, Y) —

, , . - , , .

, , — .





%  
older(sasha, lesha, fact). %   
older(misha, sasha, fact). %   
older(misha, dasha, fact). %   
older(masha, misha, fact). %   

%  
older(X,Y, rule) :- older(X, Z, fact), older(Z,Y, _).

% X  Y,  X  Z  Z  Y
% X, Y, Z -  .     , 
%     .
% :   ,        
      
      



"_" - . , , . , . .







.





?- older(masha, X, _).
X = misha ;
X = sasha ;
X = dasha ;
X = lesha ;
false.
      
      



.





, : , ? ? study(mark, math) " "? " "?. . , "", "", "". -. , . .





N.





factorial(1, 1).
factorial(N, F):-
	N1 is N-1,
	factorial(N1, F1),
  F is F1*N.

%   ,      ,  C/C++.
%      .
      
      



"is" , . N1 N-1. . "is" . , "is" "=".





. Enter, .





?- factorial(1,F).
F = 1 .

?- factorial(2,F).
F = 2 .

?- factorial(3,F).
F = 6 .

?- factorial(4,F).
F = 24 .

?- factorial(5,F).
F = 120 .

?- factorial(10,F).
F = 3628800 .
      
      



, , N 0. .





factorial(1, 1).
factorial(N, F):-
  N >= 0,
	N1 is N-1,
	factorial(N1, F1),
  F is F1*N.
      
      



:





  1. female(X), male(X) parent(X,Y).





  2. N .





  3. ( ) , .





Prolog

— . . — , . (, ) . Prolog , .. . .













, .





C/C++, Python . — ; , , — . - .





: [],[a], [abc, bc], [' 1', ' 2', 1234], [X], [Head|Tail].

[Head|Tail]. , , , , . , "|".

[X1,X2,X3|Tail]. X1, X2, X3, Tail.





, . , , , , , . , , N G. , Elem List. . , - . ( ).





, .





% element(, )
element([Head|Tail], Element) :- Element = Head; element(Tail, Element). 

?- element([1,2,3,4,5,6, 'abc', 'prolog'], Elem).
Elem = 1 ;
Elem = 2 ;
Elem = 3 ;
Elem = 4 ;
Elem = 5 ;
Elem = 6 ;
Elem = abc ;
Elem = prolog ;
false.
      
      



element([Head|Tail],Element) , Element Head ( ) element(Tail, Element) . - . ( : ? ?) , , Element [Head|Tail]. , .





. . .





% list_length(,  )
list_length([], 0).
list_length([H|T], L) :- list_length(T, L1), L is L1+1.

?- list_length([123446,232,2332,23], L).
L = 4.

?- list_length([123446,232,2332,23,sdfds,sdfsf,sdfa,asd], L).
L = 8.

?- list_length([], L).
L = 0.

?- list_length([1], L).
L = 1.

?- list_length([1,9,8,7,6,5,4,3,2], L).
L = 9.

      
      



, H. , _, singleton .





SWI Prolog length. list_length. , . , .





, . , , .





, , . , 1, 2, 3 4 [1,2,3,4]. list_member.





mymember(Elem, [Elem|_]).
mymember(Elem, [_|Tail]) :- mymember(Elem, Tail).
      
      



, , . .





Prolog

, ( ) . .





, :









  • . ,





  • .













, . :





. ,  — , , .





  1. .





  2. .





  3. .





  4. .





  5. .





  6. .





  7. .





  8. .





  9. .





  10. .





  11. , , .





  12. .





  13. .





  14. .





? ?





: 6 .





, .

. Prolog.



, : , .





Ilustración del problema

! ?

:









  1. (, Python)





. , O(n!). , , , "!". . , .





, , Python, C/C++, C#, Java, . , , , .





, . . . , — , , , .





?

, "" (, ). , .





( : . , . . , . . — . ?).





, . , , . , .





, !





  1. SWI Prolog





















  2. Escribir poesía usando el Prólogo





  3. Y, por supuesto, un enlace a Wikipedia.





  4. ¿Has oído hablar de Prologue?





  5. Ejemplos de uso de Prolog








All Articles