221V 3 лет назад
Родитель
Сommit
720e1f0495
1 измененных файлов с 235 добавлено и 0 удалено
  1. 235 0
      src/test4.pl

+ 235 - 0
src/test4.pl

@@ -0,0 +1,235 @@
+:-module(test4,
+  [train_reverse/2,
+   train_last_one/2,
+   train_sort_up/2,
+   train_sort_up2/2,
+   train_summ/2,
+   train_odds/2,
+   train_zip/3,
+   train_append_tail/3,
+   train_append_tail2/3,
+   train_concat/3,
+   test/0,
+   test2/0]).
+
+/*
+
+4. Реализовать на Прологе функции, используя арифметические операции, рекурсию и паттерн-матчинг: 
+   a. train_reverse/2 - на вход получает список вида [1,2,4,3,5] и преобразует его в (->) [5,3,4,2,1]
+   b. train_last_one/2 - на вход получает список вида [1,2,4,3,5] -> 5
+   c. train_sort_up/2 - сортирует список по возрастанию [3,1,5,2,4] -> [1,2,3,4,5]
+   d. train_summ/2 - на вход получает список вида [1,2,4,3,5] -> 15 (сумма всех элементов)
+   e. train_odds/2 - на вход получает список вида [1,2,4,3,5] -> [2,4]  (все четные)
+   f. train_zip/3 - на вход получает 2 списка вида [1,2,4,3,5] и [7,9,11,8,6] -> [[1,7],[2,9],[4,11],[3,8],[5,6]]
+   g. train_append_tail/3 - добавляет элемент в конец списка [1,2,3] и 4 -> [1,2,3,4] (сделать чисто рекурсивную реализацию)
+   h. train_concat/3 - получает на вход 2 списка [1,2,3] & [4,5,6] -> [1,2,3,4,5,6]
+
+*/
+
+
+% train_reverse(List, Result).
+train_reverse(V, R) :- train_reverse_(V, R, []).
+
+train_reverse_([], R, R).
+train_reverse_([V|T], R, A) :- 
+  train_reverse_(T, R, [V|A]).
+
+
+% train_last_one(List, Result).
+train_last_one([R], R).
+train_last_one([_|T], R) :- train_last_one(T, R).
+
+
+% train_sort_up(List, Result). % quick sort
+train_sort_up(L, R) :- train_sort_up(L, [], R).
+
+train_sort_up([], A, A).
+train_sort_up([H|T], A, R) :- 
+  train_sort_up_(H, T, A1, A2),
+  train_sort_up(A1, A, R1),
+  train_sort_up(A2, [H|R1], R).
+
+train_sort_up_(_H, [], [], []).
+train_sort_up_(H, [H2|T], [H2|T2], L3) :- H2 > H,  train_sort_up_(H, T, T2, L3).
+train_sort_up_(H, [H2|T], L, [H2|T3])  :- H2 =< H, train_sort_up_(H, T, L, T3).
+
+
+% train_sort_up2(List, Result). % insert sort
+train_sort_up2(L, R) :- train_sort_up2(L, [], R).
+
+train_sort_up2([], A, A).
+train_sort_up2([H|T], A, R) :- 
+  train_sort_up2_(H, A, A2),
+  train_sort_up2(T, A2, R).
+
+train_sort_up2_(H, [H2|T], [H2|T2])   :- H > H2, train_sort_up2_(H, T, T2).
+train_sort_up2_(H, [H2|T], [H, H2|T]) :- H =< H2.
+train_sort_up2_(H, [], [H]).
+
+
+% train_summ(List, Result).
+train_summ(L, R) :- train_summ(L, 0, R).
+
+train_summ([], A, A).
+train_summ([H|T], A, R) :- 
+  A2 is A + H,
+  train_summ(T, A2, R).
+
+
+% train_odds(List, Result).
+train_odds(L, R) :- train_odds(L, [], R).
+
+train_odds([], A, R) :- train_reverse(A, R).
+train_odds([H|T], A, R) :- 
+  0 is mod(H, 2),
+  train_odds(T, [H|A], R);
+  % false
+  train_odds(T, A, R).
+
+
+% train_zip(List, List, Result).
+train_zip(L, L2, R) :- train_zip(L, L2, [], R).
+train_zip([], [], A, R) :- train_reverse(A, R).
+train_zip([H1|T1], [H2|T2], A, R) :- 
+  train_zip(T1, T2, [[H1, H2]|A], R).
+
+
+% train_append_tail(List, Element, Result).
+train_append_tail(L, E, R) :- train_append_tail_(L, [E], R).
+train_append_tail_([H|T], E, [H|R]) :- train_append_tail_(T, E, R).
+train_append_tail_([], R, R).
+
+
+% train_append_tail2(List, Element, Result).
+train_append_tail2(L, E, R) :- train_append_tail2_(L, E, [], R).
+train_append_tail2_([H|T], E, A, R) :- train_append_tail2_(T, E, [H|A], R).
+train_append_tail2_([], E, A, R) :- train_reverse([E|A], R).
+
+% train_concat(List, List, Result).
+train_concat([], L, L).
+train_concat([H|T], L, [H|R]) :- 
+  train_concat(T, L, R).
+
+
+test() :- 
+  train_reverse([1,2,4,3,5], R),
+  format("~w -> ~w~n", ["train_reverse([1,2,4,3,5], R)", R]),
+  
+  train_last_one([1,2,4,3,5], R2),
+  format("~w -> ~w~n", ["train_last_one([1,2,4,3,5], R2)", R2]),
+  
+  train_sort_up([3,1,5,2,4], R3),
+  format("~w -> ~w~n", ["train_sort_up([3,1,5,2,4], R3)", R3]),
+  
+  train_sort_up2([3,1,5,2,4], R4),
+  format("~w -> ~w~n", ["train_sort_up2([3,1,5,2,4], R4)", R4]),
+  
+  train_summ([1,2,3,4,5], R5),
+  format("~w -> ~w~n", ["train_summ([1,2,3,4,5], R5)", R5]),
+  
+  train_odds([1,2,3,4,5], R6),
+  format("~w -> ~w~n", ["train_odds([1,2,3,4,5], R6)", R6]),
+  
+  train_zip([1,2,4,3,5], [7,9,11,8,6], R7),
+  format("~w -> ~w~n", ["train_zip([1,2,4,3,5], [7,9,11,8,6], R7)", R7]),
+  
+  train_append_tail([1,2,3], 4, R8),
+  format("~w -> ~w~n", ["train_append_tail([1,2,3], 4, R8)", R8]),
+  
+  train_append_tail2([1,2,3], 4, R9),
+  format("~w -> ~w~n", ["train_append_tail2([1,2,3], 4, R9)", R9]),
+  
+  train_concat([1,2,3], [4,5,6], R10),
+  format("~w -> ~w~n", ["train_concat([1,2,3], [4,5,6], R10)", R10]).
+
+
+test2() :- 
+  get_time(T1),
+  test_loop1(1_000_000),
+  get_time(T2),
+  
+  Z1 is T2 - T1,
+  format("Time 1: ~w~n", [Z1]),
+  
+  test_loop2(1_000_000),
+  get_time(T3),
+  
+  Z2 is T3 - T2,
+  format("Time 2: ~w~n", [Z2]).
+
+
+test_loop1(1) :- 
+  train_sort_up([28,15,26,19,18,1,29,4,8,20,3,30,11,10,22,5,14,27,9,25,12,16,2,24,17,23,13,7,21,6], R),
+  format("~w -> ~w~n", ["train_sort_up([28,15,26,19,18,1,29,4,8,20,3,30,11,10,22,5,14,27,9,25,12,16,2,24,17,23,13,7,21,6], R)", R]).
+test_loop1(N) :- 
+  train_sort_up([28,15,26,19,18,1,29,4,8,20,3,30,11,10,22,5,14,27,9,25,12,16,2,24,17,23,13,7,21,6], _R), !,
+  %format("~w -> ~w~n", ["train_sort_up([28,15,26,19,18,1,29,4,8,20,3,30,11,10,22,5,14,27,9,25,12,16,2,24,17,23,13,7,21,6], R)", R]),
+  N2 is N - 1,
+  test_loop1(N2).
+
+test_loop2(1) :- 
+  train_sort_up2([28,15,26,19,18,1,29,4,8,20,3,30,11,10,22,5,14,27,9,25,12,16,2,24,17,23,13,7,21,6], R),
+  format("~w -> ~w~n", ["train_sort_up2([28,15,26,19,18,1,29,4,8,20,3,30,11,10,22,5,14,27,9,25,12,16,2,24,17,23,13,7,21,6], R)", R]).
+test_loop2(N) :- 
+train_sort_up2([28,15,26,19,18,1,29,4,8,20,3,30,11,10,22,5,14,27,9,25,12,16,2,24,17,23,13,7,21,6], _R), !,
+  %format("~w -> ~w~n", ["train_sort_up2([28,15,26,19,18,1,29,4,8,20,3,30,11,10,22,5,14,27,9,25,12,16,2,24,17,23,13,7,21,6], R)", R]),
+  N2 is N - 1,
+  test_loop2(N2).
+
+
+/*
+
+$ prolog
+
+?- consult(test4).
+true.
+
+?- test().
+train_reverse([1,2,4,3,5], R) -> [5,3,4,2,1]
+train_last_one([1,2,4,3,5], R2) -> 5
+train_sort_up([3,1,5,2,4], R3) -> [1,2,3,4,5]
+train_sort_up2([3,1,5,2,4], R4) -> [1,2,3,4,5]
+train_summ([1,2,3,4,5], R5) -> 15
+train_odds([1,2,3,4,5], R6) -> [2,4]
+train_zip([1,2,4,3,5], [7,9,11,8,6], R7) -> [[1,7],[2,9],[4,11],[3,8],[5,6]]
+train_append_tail([1,2,3], 4, R8) -> [1,2,3,4]
+train_append_tail2([1,2,3], 4, R9) -> [1,2,3,4]
+train_concat([1,2,3], [4,5,6], R10) -> [1,2,3,4,5,6]
+true .
+
+?- test2().
+train_sort_up([28,15,26,19,18,1,29,4,8,20,3,30,11,10,22,5,14,27,9,25,12,16,2,24,17,23,13,7,21,6], R) -> [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30]
+Time 1: 47.11411905288696
+train_sort_up2([28,15,26,19,18,1,29,4,8,20,3,30,11,10,22,5,14,27,9,25,12,16,2,24,17,23,13,7,21,6], R) -> [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30]
+Time 2: 51.70973443984985
+true
+
+?- trace.
+true.
+
+[trace]  ?- train_append_tail([1,2,3], 4, R).
+   Call: (10) test4:train_append_tail([1, 2, 3], 4, _13938) ? creep
+   Call: (11) test4:train_append_tail_([1, 2, 3], [4], _13938) ? creep
+   Call: (12) test4:train_append_tail_([2, 3], [4], _15972) ? creep
+   Call: (13) test4:train_append_tail_([3], [4], _16748) ? creep
+   Call: (14) test4:train_append_tail_([], [4], _17524) ? creep
+   Exit: (14) test4:train_append_tail_([], [4], [4]) ? creep
+   Exit: (13) test4:train_append_tail_([3], [4], [3, 4]) ? creep
+   Exit: (12) test4:train_append_tail_([2, 3], [4], [2, 3, 4]) ? creep
+   Exit: (11) test4:train_append_tail_([1, 2, 3], [4], [1, 2, 3, 4]) ? creep
+   Exit: (10) test4:train_append_tail([1, 2, 3], 4, [1, 2, 3, 4]) ? creep
+R = [1, 2, 3, 4].
+
+[trace]  ?- train_concat([1,2,3], [4,5,6], R).
+   Call: (10) test4:train_concat([1, 2, 3], [4, 5, 6], _36218) ? creep
+   Call: (11) test4:train_concat([2, 3], [4, 5, 6], _37518) ? creep
+   Call: (12) test4:train_concat([3], [4, 5, 6], _38294) ? creep
+   Call: (13) test4:train_concat([], [4, 5, 6], _39070) ? creep
+   Exit: (13) test4:train_concat([], [4, 5, 6], [4, 5, 6]) ? creep
+   Exit: (12) test4:train_concat([3], [4, 5, 6], [3, 4, 5, 6]) ? creep
+   Exit: (11) test4:train_concat([2, 3], [4, 5, 6], [2, 3, 4, 5, 6]) ? creep
+   Exit: (10) test4:train_concat([1, 2, 3], [4, 5, 6], [1, 2, 3, 4, 5, 6]) ? creep
+R = [1, 2, 3, 4, 5, 6].
+
+*/
+