teleias

prolog

Dec 3rd, 2014
347
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Prolog 2.17 KB | None | 0 0
  1. % Question X1: Fracktorial %
  2. fracktorial(X, Ans) :- isEven(X, Even), fracktorial(X, Ans, Even).
  3. fracktorial(0, Ans, _) :- Ans is 1.
  4. fracktorial(X, Ans, 1) :- X > 0, Y is X-2, fracktorial(Y, Ans2, 1), Ans is Ans2*X.
  5. fracktorial(X, Ans, 0) :- X > 0, Y is X-1, fracktorial(Y, Ans2, 1), Ans is Ans2.
  6. isEven(0, Ans) :- Ans is 1.
  7. isEven(1, Ans) :- Ans is 0.
  8. isEven(X, Ans) :- X > 1, Y is X-2, isEven(Y, Ans).
  9.  
  10.  
  11. % Question X2: ReverseListHalves %
  12. reverseListHalves(L, A) :- count(L, Count), isEven(Count, Even), reverseListHalves(L,A,Even).
  13. reverseListHalves(L, A, 0) :- %if odd
  14.  count(L, Count),
  15.  End is Count-1, myFloor(End/2,Middle), Start is 0,
  16.  MiddlePre is Middle-1, MiddlePost is Middle+1,
  17.  sub(Start,MiddlePre,L,Half1), sub(MiddlePost,End,L,Half2),
  18.  myReverse(Half1,Half1r), myReverse(Half2,Half2r),
  19.  getIndexInL(Middle,L,MiddleElement),
  20.  myAppend(Half1r,MiddleElement,Half1r2),
  21.  myConcat(Half1r2,Half2r,A).
  22. reverseListHalves(L, A, 1) :- %if even
  23.  count(L, Count),
  24.  End is Count-1, Middle is End/2, Start is 0,
  25.  sub(Start,Middle,L,Half1), sub(Middle,End,L,Half2),
  26.  myReverse(Half1,Half1r), myReverse(Half2,Half2r),
  27.  myConcat(Half1r,Half2r,A).
  28. count([], A) :- A is 0.
  29. count([_|L1b], A) :- count(L1b, A2), A is A2+1.
  30. sub(Start,End,L,A) :- sub(0,Start,End,L,A).
  31. sub(_,_,_,[],A).
  32. sub(Index,_,End,L,A) :- Index > End, A = [].
  33. sub(Index,Start,End,L,A) :- Index < Start, Index2 is Index+1, sub(Index2,Start,End,L,A).
  34. sub(Index,Start,End,L,[A2|A3]) :- Index >= Start, Index =< End, getIndexInL(Index,L,A2), Index2 is Index+1, sub(Index2,Start,End,L,A3).
  35. getIndexInL(Index,L,A) :- getIndexInL(Index,0,L,A).
  36. getIndexInL(Index,Index,[A|_],A).
  37. getIndexInL(Index,X,[L1a|L1b],A) :- Index \= X, X2 is X+1, getIndexInL(Index,X2,L1b,A).
  38. myReverse([],L2) :- L2 = [].
  39. myReverse([L1a|L1b],A) :- myReverse(L1b, L2), myAppend(L2,L1a,A).
  40. myAppend([],X,[X]).
  41. myAppend([La|Lb],X,A) :- myAppend(Lb,X,A2), A = [La|A2].
  42. myConcat([],A,A).
  43. myConcat([L1a|L1b],L2,[L1a|A2]) :- myConcat(L1b,L2,A2).
  44. myFloor(Input,Output) :- myFloor(Input,Output,0).
  45. myFloor(Input,Index,Index) :- Index >= Input, Output is Index.
  46. myFloor(Input,Output,Index) :- Index < Input, Index2 is Index+1, myFloor(Input,Output,Index2).
Advertisement
Add Comment
Please, Sign In to add comment