рдореИрдВ Habr├й рдкрд░ рдЖрдЗрдВрд╕реНрдЯреАрди рдХреЗ рдХрд╛рд░реНрдп рдХреЗ рд╕рдкреНрддрд╛рд╣ рдХреЛ рдЬрд╛рд░реА рд░рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред
рдмрд╣реБрдд ,
рдмрд╣реБрдд рд╣реА рдЧреИрд░-рдорд╛рдирдХ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреЗ рдмрд╛рдж, рдореИрдВ рдпрд╣ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рддрд╛рд░реНрдХрд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ (рдЯреЙрдЯреЛрд▓реЙрдЬреА рдХреЗ рд▓рд┐рдП рдЦреЗрдж) рдореЗрдВ рддрд╛рд░реНрдХрд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдФрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)ред
рдХрдЯреМрддреА рдХреЗ рддрд╣рдд, рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрд▓реЙрдЧ рдЗрддрдиреА рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЕрдиреБрдХреВрд▓ рдХреНрдпреЛрдВ рд╣реИред
рдХрд╛рд░реНрдп рд╢рд╛рдпрдж рд╕рднреА рд╕реЗ рддрдВрдЧ рдЖ рдЪреБрдХрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд░рд╣реВрдВрдЧрд╛ред
рдХреЙрдорд░реЗрдб
рдЬрд╝реЛрдирд┐рдХреНрд╕ рдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА
рдкреНрд░реЛрд▓реЙрдЧ рдХреА
рдореВрд▓ рдмрд╛рддреЗрдВ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЪрд┐рддреНрд░рд┐рдд рдХреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореЗрд░рд╛ рдХрд╛рдо рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред
рд╣рдо рдШрд░ рдХреЛ 5 рддрддреНрд╡реЛрдВ рдХреА рд╕реВрдЪреА рдХреЗ рд░реВрдк рдореЗрдВ рдкреЗрд╢ рдХрд░реЗрдВрдЧреЗ, рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ: рдорд╛рд▓рд┐рдХ рдХреА рдкрд╛рд▓рддреВ рдЬрд╛рдирд╡рд░, рдкрд╛рд▓рддреВ рдЬрд╛рдирд╡рд░, рд╕рд┐рдЧрд░реЗрдЯ рдХрд╛ рдмреНрд░рд╛рдВрдб, рдкреЗрдп рдФрд░ рдШрд░ рдХрд╛ рд░рдВрдЧ, рдХреНрд░рдорд╢рдГред рдХреБрд▓ 5 рдШрд░ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рд▓рдВрдмрд╛рдИ 5 рдХреА рд╕реВрдЪрд┐рдпреЛрдВ (рд╕реВрдЪрд┐рдпреЛрдВ) рдХреЗ рдмреАрдЪ рдПрдХ рд╕рдорд╛рдзрд╛рди рдХреА рддрд▓рд╛рд╢ рдХрд░реЗрдВрдЧреЗред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдорд╛рдирдХ рд╡рд┐рдзреЗрдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
- рд╕рджрд╕реНрдп (рдПрд▓рдо, рд╕реВрдЪреА) - рдпрджрд┐ рдПрд▓рд┐рдо рддрддреНрд╡ рд╕реВрдЪреА рдореЗрдВ рд╣реИ рддреЛ рд╕рдЪ рд╣реИ
- nth1 (N, List, Elem) - рд╕рд╣реА рд╣реИ рдпрджрд┐ рд╕реВрдЪреА рдореЗрдВ Elem рддрддреНрд╡ N-th рдкрд░ рд╣реИ (рдЧрд┐рдирддреА 1 рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ)
- рдЕрдЧрд▓реА рдПрдХреНрд╕ (рдПрдХреНрд╕, рд╡рд╛рдИ, рд▓рд┐рд╕реНрдЯ) - рдПрдХреНрд╕ рдореЗрдВ рд▓рд┐рд╕реНрдЯ рдХреЗ рдкрд╣рд▓реЗ (рдмрд╛рдпреАрдВ рдУрд░) рд╡рд╛рдИ рд╣реИ рддреЛ рд╕рд╣реА
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдореЗрдВ рдпрд╣ рдХрд╣рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ 2 рдШрд░ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рдмрдЧрд▓ рдореЗрдВ рдЦрдбрд╝реЗ рд╣реИрдВред рдЗрд╕реЗ рдЗрд╕ рд╕рд░рд▓ рд╡рд┐рдзреЗрдп рдХреЗ рд╕рд╛рде рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
neighbors ( X , Y , List ) :- nextto ( X , Y , List ) .
neighbors ( X , Y , List ) :- nextto ( Y , X , List ) .
рдпрд╣реА рд╣реИ, рдпрд╛ рддреЛ рд╡рд╛рдИ рдХреЗ рдмрд╛рдИрдВ рдУрд░ рдПрдХреНрд╕, рдпрд╛ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрддред
рдФрд░ рдпрд╣рд╛рдБ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рдорд╛рдзрд╛рди рд╣реИ:
einstein :-
/* 0. 5 */
Houses = [ _ , _ , _ , _ , _ ] ,
/* 1. . */
nth1 ( 1 , Houses , [ norwegian , _ , _ , _ , _ ] ) ,
/* 2. . */
member ( [ englishman , _ , _ , _ , red ] , Houses ) ,
/* 3. , . */
nextto ( [ _ , _ , _ , _ , green ] , [ _ , _ , _ , _ , white ] , Houses ) ,
/* 4. . */
member ( [ dane , _ , _ , tea , _ ] , Houses ) ,
/* 5. , Marlboro, , . */
neighbors ( [ _ , _ , marlboro , _ , _ ] , [ _ , cat , _ , _ , _ ] , Houses ) ,
/* 6. , , Dunhill. */
member ( [ _ , _ , dunhill , _ , yellow ] , Houses ) ,
/* 7. Rothmans. */
member ( [ german , _ , rothmans , _ , _ ] , Houses ) ,
/* 8. , , . */
nth1 ( 3 , Houses , [ _ , _ , _ , milk , _ ] ) ,
/* 9. , Marlboro, . */
neighbors ( [ _ , _ , marlboro , _ , _ ] , [ _ , _ , _ , water , _ ] , Houses ) ,
/* 10. , Pall Mall, . */
member ( [ _ , bird , pallmall , _ , _ ] , Houses ) ,
/* 11. . */
member ( [ swede , dog , _ , _ , _ ] , Houses ) ,
/* 12. . */
neighbors ( [ norwegian , _ , _ , _ , _ ] , [ _ , _ , _ , _ , blue ] , Houses ) ,
/* 13. , , . */
member ( [ _ , horse , _ , _ , blue ] , Houses ) ,
/* 14. , Winfield, . */
member ( [ _ , _ , winfield , beer , _ ] , Houses ) ,
/* 15. . */
member ( [ _ , _ , _ , coffee , green ] , Houses ) ,
/* , : ? */
member ( [ Owner , fish , _ , _ , _ ] , Houses ) ,
/* */
print ( 'Owner of the fish: ' ) , print ( Owner ) , nl ,
print ( 'Full Solution: ' ) , print ( Houses ) , nl .
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рд▓рд╛рдЗрдиреЛрдВ рдХреА рдХреБрд▓ рд╕рдВрдЦреНрдпрд╛ рд▓рдЧрднрдЧ рдореВрд▓ рд╕рдорд╕реНрдпрд╛ рдХреА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдореЗрд▓ рдЦрд╛рддреА рд╣реИред
рдФрд░ рд▓рд╛рдЗрдиреЗрдВ рд╕реНрд╡рдпрдВ рдореВрд▓ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреА рддрд░рд╣ рд▓рдЧрднрдЧ рдкрдврд╝реА рдЬрд╛рддреА рд╣реИрдВред рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рдШреЛрд╖рдгрд╛рддреНрдордХ рднрд╛рд╖рд╛ рд╣реИ, рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдпрд╣ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕рд╕реЗ рдХреНрдпрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рджреБрднрд╛рд╖рд┐рдпрд╛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╕рднреА рдЧрдВрджреЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдмрд╣реБрдд рдЬрд▓реНрджреАред рдореЗрд░реА рдорд╢реАрди рдкрд░, рд╕реНрдХреНрд░рд┐рдкреНрдЯ 0.08 рд╕реЗрдХреЗрдВрдб рдореЗрдВ рдЪрд▓рддреА рд╣реИ, рдЕрдЧрд░ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рддреЛ рдпрд╣ рдереЛрдбрд╝рд╛ рддреЗрдЬ рднреА рд╣реЛрдЧрд╛ред
рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ SWI-Prolog рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХреЙрдкреА рдХрд░реЗрдВ рдФрд░ рдРрд╕рд╛ рд╣реИрд╢-рдмреИрдВрдЧ рдЬреЛрдбрд╝реЗрдВ:
# ! / usr / bin / pl - q - t рдЖрдЗрдВрд╕реНрдЯреАрди - s(рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рдпрд╛
рдпрд╣рд╛рдБ рд╕реЗ рдХреЛрдб рд▓реЗ)
рдпреЗ рдХрд╛рд░реНрдп рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдкреВрд░реНрдгрддрд╛ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ, рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ "рдХреНрд▓реАрди" рдкреНрд░реЛрд▓реЙрдЧ рдкрд░ рднреА рд╕рдорд╛рдзрд╛рди рдЬреНрдпрд╛рджрд╛ рдмрдбрд╝рд╛ рдирд╣реАрдВ рд╣реИред
member ( X , [ X | _]).
member ( X , [_ | Rest ]) :- member ( X , Rest ).
nth1 ( 1 , [ Elem | _], Elem ).
nth1 ( N , [_ | Rest ], Elem ) :- N > 1 , K is N - 1 , nth1 ( K , Rest , Elem ).
nextto ( L , R , [ L , R | _]).
nextto ( L , R , [_ | Rest ]) :- nextto ( L , R , Rest ).
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕реНрдерд┐рддрд┐ 0, 1 рдФрд░ 8 рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
Houses = [[norwegian,_,_,_,_],_,[_,_,_,milk,_],_,_]
рддрдм nth1 рд╡рд┐рдзреЗрдп рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдореВрд▓ рдХреЗ рдЬрд┐рддрдирд╛ рдХрд░реАрдм рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред