рдмреБрдз рдореЗрдВ рдПрдХ рдмреНрд░реЗрдирдлреИрдХ рджреБрднрд╛рд╖рд┐рдпрд╛ рд▓рд┐рдЦрдирд╛

рд╣рдлрд╝реНрддреЗ рдореЗрдВ рдмреНрд░реЗрдирдлрд╝реЙрдХ рдХреЛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реБрдП рдФрд░ рдмреБрдз рдХреЗ рд╕рд╛рде рдЙрдирдХреЗ рдкреНрд░рдпреЛрдЧреЛрдВ рдиреЗ рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЗ рдЕрдкрдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд▓рд┐рдЦрд╛ред рдореИрдВ рдмреБрдз рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ "рдкрд░рд┐рдЪрдпрд╛рддреНрдордХ" рд▓реЗрдЦ рдкреНрд░рд╕реНрддреБрдд рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рдорд╛рдлреА рдорд╛рдБрдЧрддрд╛ рд╣реВрдБред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╡рд╣ рд▓рд┐рдЦрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╣реИред

рдЗрд╕ рдмреАрдЪ, рдореИрдВ рдПрдХ рд╕рдорд╛рдзрд╛рди рдХреЛрдб рджреВрдВрдЧрд╛ рдЬреЛ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдмреБрдз рднрд╛рд╖рд╛ рдХреА рдХрдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдЧрд╛ред



:- module bf. :- interface. :- import_module io. :- pred main(io::di, io::uo) is det. :- implementation. :- import_module list, string, char, solutions, require, int. :- type bf_cmd ---> plus; minus; step; back; print; cycle(list(bf_cmd)). :- type bf_state ---> bf_state( left :: list(int), cell :: int, right :: list(int) ). hello_world = "++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++\ .>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.\ ------.--------.>+.>.". squares_1_to_1000 = "++++[>+++++<-]>[<+++++>-]+<+[\ >[>+>+<<-]++>>[<<+>>-]>>>[-]++>[-]+\ >>>+[[-]++++++>>>]<<<[[<++++++++<++>>-]+<.<[>----<-]<]\ <<[>>>>>[>>>[-]+++++++++<[>-<-]+++++++++>[-[<->-]+[<<<]]<[>+<-]>]<<-]<<-\ ]". fib_1_to_100 = "+++++++++++\ >+>>>>++++++++++++++++++++++++++++++++++++++++++++\ >++++++++++++++++++++++++++++++++<<<<<<[>[>>>>>>+>\ +<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]<[>++++++++++[-\ <-[>>+>+<<<-]>>>[<<<+>>>-]+<[>[-]<[-]]>[<<[>>>+<<<\ -]>>[-]]<<]>>>[>>+>+<<<-]>>>[<<<+>>>-]+<[>[-]<[-]]\ >[<<+>>[-]]<<<<<<<]>>>>>[+++++++++++++++++++++++++\ +++++++++++++++++++++++.[-]]++++++++++<[->-<]>++++\ ++++++++++++++++++++++++++++++++++++++++++++.[-]<<\ <<<<<<<<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-]<-[>>.>.<<<\ [-]]<<[>>+>+<<<-]>>>[<<<+>>>-]<<[<+>-]>[<+>-]<<<-]". prog_to_ast(Prog) = Ast :- to_char_list(Prog, Chars), solutions(pred(Ast_::out) is nondet :- ast(Ast_, Chars, []:list(char)), Asts), ( Asts = [], error("Program invalid (parse error)!") ; Asts = [Ast|_] ). :- mode ast(out, in, out) is multi. ast([plus|Cmds]) --> ['+'], ast(Cmds). ast([minus|Cmds]) --> ['-'], ast(Cmds). ast([step|Cmds]) --> ['>'], ast(Cmds). ast([back|Cmds]) --> ['<'], ast(Cmds). ast([print|Cmds]) --> ['.'], ast(Cmds). ast([cycle(Cycle)|Cmds]) --> ['['], ast(Cycle), [']'], ast(Cmds). ast([]) --> []. execute_ast([], !State) --> []. execute_ast([Cmd|Cmds], !State) --> execute_cmd(Cmd, !State), execute_ast(Cmds, !State). execute_cmd(plus, bf_state(L,C,R), bf_state(L, C+1, R)) --> []. execute_cmd(minus, bf_state(L,C,R), bf_state(L, C-1, R)) --> []. execute_cmd(step, bf_state(L,C,R), bf_state([C|L], H, T)) --> {R = [], H=0, T=[]; R = [H|T]}. execute_cmd(back, bf_state(L,C,R), bf_state(T, H, [C|R])) --> {L = [], H=0, T=[]; L = [H|T]}. execute_cmd(print, S @ bf_state(_,C,_), S) --> print(char.det_from_int( C ):char). execute_cmd(Cmd @ cycle(Cmds), !.S @ bf_state(_,C,_), !:S) --> ( {C \= 0} -> execute_ast(Cmds, !S), execute_cmd(Cmd, !S) ; [] ). execute_str(Prog) --> {Ast = prog_to_ast(Prog)}, execute_ast(Ast, bf_state([], 0, []), _). main --> execute_str(hello_world), nl, execute_str(squares_1_to_1000), nl, execute_str(fib_1_to_100).
      
      







рдФрд░ рддреБрд░рдВрдд рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдЙрддреНрдкрд╛рджрди:



 D:\stuff\test\mercury>bf.exe Hello World! 0 1 4 9 16 25 36 49 64 81 100 121 ... < > 9025 9216 9409 9604 9801 10000 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89
      
      







рдореЗрд░реЗ рдлреИрд╕рд▓реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ред рдЗрд╕рдореЗрдВ 2 рдЪрд░рдг рд╣реЛрддреЗ рд╣реИрдВ

  1. рдПрдПрд╕рдЯреА (рд╕рд╛рд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЯреНрд░реА) рдореЗрдВ рдЯреЗрдХреНрд╕реНрдЯ рдмреНрд░реЗрдирдлрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдмрджрд▓рдирд╛
  2. рд▓рдХрдбрд╝реА рд╕рдВрд╕реНрдХрд░рдг рдПрдПрд╕рдЯреА


рдкрд╣рд▓реЗ рдЪрд░рдг рдореЗрдВ, рдмреАрдПрдл рдХреЛрдб рдХреЗ рдПрдХ рдЯреБрдХрдбрд╝реЗ рд╕реЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, '+++ >> [+ -] <' рд╣рдореЗрдВ рд╕реВрдЪреА рдХреЗ рд░реВрдк рдореЗрдВ рдПрдПрд╕рдЯреА рд╕рдВрд░рдЪрдирд╛ рдорд┐рд▓рддреА рд╣реИ [рдкреНрд▓рд╕, рдкреНрд▓рд╕, рдкреНрд▓рд╕, рд╕реНрдЯреЗрдк, рд╕реНрдЯреЗрдк, рд╕рд╛рдЗрдХрд▓ ([рдкреНрд▓рд╕, рдорд╛рдЗрдирд╕]), рд╡рд╛рдкрд╕]ред рдЗрд╕рдХреЗ рд▓рд┐рдП nondeterministic predicate ast рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдЗрд╕ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИрдВ, рдореИрдВ рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдПрдХ рд╡рд┐рдзреЗрдп рд╣реИ рдЬреЛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЗрди рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреЛ рдмреИрдХрдЯреНрд░реИрдХрд┐рдВрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрдм рддрдХ рдХрд┐ рдкреВрд░реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдпрд╣ рдФрд░ рдЗрд╕рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рди рд╣реЛред рд╕рдЪ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдпрд╣ рд╕рд┐рджреНрдзрд╛рдВрдд рдПрдХ рдкрд╛рд░реНрд╕рд░ рд▓рд┐рдЦрдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдЬреЛ рдЗрди-рдбреЗрдкреНрде рд╕рд░реНрдЪ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддрд╛ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рдХрдИ рдХрдорд┐рдпрд╛рдВ рд╣реИрдВ, рдпрд╣ рд╡рд┐рд╖рдп рдЗрд╕ рд╣реЗрдмреНрд░реЛрдЯреЛрдкрд┐рдХрд╛ рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╡рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдпрд╣ рдЪрд░рдг, рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЗ рд╕рд╛рде, рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рд╢реБрджреНрдзрддрд╛ (рдЕрд░реНрдерд╛рддреН, рдмреНрд░реИрдХреЗрдЯ рд╕рдВрд░рдЪрдирд╛ рдХреА рд╢реБрджреНрдзрддрд╛) рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рдЧрд▓рдд рд╣реИ, рддреЛ рд▓рдХреНрд╖реНрдп ast (Ast_, Chars, []: list (char)) рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рд╣рдо рддреНрд░реБрдЯрд┐ "рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЕрдорд╛рдиреНрдп (рдкрд╛рд░реНрд╕ рддреНрд░реБрдЯрд┐)!" рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред рджреВрд╕рд░реА рдЯрд┐рдкреНрдкрдгреА: рдбреАрд╕реА рдкреНрд░рдЬреЗрдВрдЯреЗрд╢рди рдореЗрдВ рдореВрд▓ рд╡рд┐рдзреЗрдп рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдкрд╛рд░рд╛ рднрд╛рд╖рд╛ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдХрдИ рдкрд╛рд░рдВрдкрд░рд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реИред



рджреВрд╕рд░реЗ рдЪрд░рдг рдореЗрдВ (рдЬреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ * * рд╡рд┐рдзреЗрдп рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВ), рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╡реГрдХреНрд╖ "рдЧрдгрдирд╛" рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд_ * рд╡рд┐рдзреЗрдп рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрд▓ рд░рд┐рдмрди рдХреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдерд┐рддрд┐ рд▓реЗрддрд╛ рд╣реИ, рдЗрд╕реЗ рдмреНрд░реЗрдирдлрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдПрдПрд╕рдЯреА рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдмрджрд▓рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рд╡рд┐рдзреЗрдп рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рддрд╛ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ, рдХрд╛рд░реНрдпрд╛рддреНрдордХ рднрд╛рд╖рд╛рдПрдВ рдкрд░рд╕реНрдкрд░ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рд╕рд╣рди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреА рд╣реИрдВ)ред



рдпрд╣рд╛рдВ рдЗрд╕реЗ рдЯреЗрдк рдХреА рд╕реНрдерд┐рддрд┐ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рд╕рдВрд░рдЪрдирд╛ рдкрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, (рд╕рд╣реА рдврдВрдЧ рд╕реЗ) рдЪрдпрдирд┐рдд рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдЗрд╖реНрдЯрддрдо (рдЗрд╖реНрдЯрддрдо) рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдФрд░ рдЗрд╕рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреА рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЯреЗрдк рдХреА рд╕рдВрд░рдЪрдирд╛ рджреЛ рд╕реВрдЪрд┐рдпреЛрдВ рдФрд░ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЧрдИ рдереА: bf_state (LeftCells, Cell, RightCells)ред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде, рд╕реЗрд▓ рдХреЛ рдмрдврд╝рд╛рдирд╛ рдФрд░ рдШрдЯрд╛рдирд╛ рд╕реЗрд▓ -1 рд╕реЗ рдмрджрд▓ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ рдмрд╛рдПрдВ (рджрд╛рдПрдВ) рдкрд░ рд╢рд┐рдлреНрдЯ рдХрд░рдирд╛ рд╣реИ, рдпрд╣ рд╕реВрдЪреА рд╣реЗрдб рдХреЛ рд▓реЗрдлреНрдЯ (рд░рд╛рдЗрдЯ) рд╕реЗрд▓ рд╕реЗ рд╕реЗрд▓ рдХреА рдЬрдЧрд╣ рдкрд░ рд▓реЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдФрд░ рд╕реЗрд▓ рдЦреБрдж рд░рд╛рдЗрдЯ (рд▓реЗрдлреНрдЯ) рд╕реЗрд▓ рд╣реЗрдб (рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХреЗрд╕) рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╕реЗрд▓ = 0 рд▓реЗрдлреНрдЯ (рд░рд╛рдЗрдЯ) рд╕реЗрд▓реНрд╕ рдХреА рдЦрд╛рд▓реА рд╕реВрдЪреА рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВред



рдЗрд╕ рджреГрд╢реНрдп рдХрд╛ рд▓рд╛рдн:



рдПрдХ рдФрд░ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдгред рдПрдХ рдЕрддреБрд▓рдиреАрдп рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐! рдПрд╕ рдкрд╛рд░рд╛ рдореЗрдВ рдПрдХ рд░рд╛рдЬреНрдп рдЪрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЪрд░ рдХреА рдПрдХ рдЬреЛрдбрд╝реА рд╣реИ!ред рдПрд╕ред: рдПрд╕ рдХреЗ рд╕рд╛рде рдФрд░ рдмрд╛рд╣рд░ рдореЛрдбред рдпрд╣ рдкреВрд░реНрд╡ рд╕реЗ рдЕрдЧрд▓реЗ рддрдХ рдЧреБрдЬрд░рдиреЗ рд╡рд╛рд▓реЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдЕрд░реНрдерд╛рддреНред рдЕрднрд┐рд▓реЗрдЦ



some_pred(In, Out) :- pred1(In, In1), pred2(In1, In2), pred3(In2, Out).







рдХреЗ рдмрд░рд╛рдмрд░:



some_pred(!.S, !:S) :- pred1(!.S, !:S), pred2(!.S, !:S), pred3(!.S, !:S). %







рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ рдЗрд╕рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ:



some_pred(!S) :- pred1(!S), pred2(!S), pred3(!S).







рдпрд╛ DCG рд╕рдВрдХреЗрддрди рдХреЗ рд░реВрдк рдореЗрдВ:



some_pred --> pred1, pred2, pred3.







рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдПрдХ рд▓реЗрдЦ рдореЗрдВ рдкрд╛рд░реЗ рдХреА рдЕрдиреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ =)



All Articles