Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- % Question X1: Fracktorial %
- fracktorial(X, Ans) :- isEven(X, Even), fracktorial(X, Ans, Even).
- fracktorial(0, Ans, _) :- Ans is 1.
- fracktorial(X, Ans, 1) :- X > 0, Y is X-2, fracktorial(Y, Ans2, 1), Ans is Ans2*X.
- fracktorial(X, Ans, 0) :- X > 0, Y is X-1, fracktorial(Y, Ans2, 1), Ans is Ans2.
- isEven(0, Ans) :- Ans is 1.
- isEven(1, Ans) :- Ans is 0.
- isEven(X, Ans) :- X > 1, Y is X-2, isEven(Y, Ans).
- % Question X2: ReverseListHalves %
- reverseListHalves(L, A) :- count(L, Count), isEven(Count, Even), reverseListHalves(L,A,Even).
- reverseListHalves(L, A, 0) :- %if odd
- count(L, Count),
- End is Count-1, myFloor(End/2,Middle), Start is 0,
- MiddlePre is Middle-1, MiddlePost is Middle+1,
- sub(Start,MiddlePre,L,Half1), sub(MiddlePost,End,L,Half2),
- myReverse(Half1,Half1r), myReverse(Half2,Half2r),
- getIndexInL(Middle,L,MiddleElement),
- myAppend(Half1r,MiddleElement,Half1r2),
- myConcat(Half1r2,Half2r,A).
- reverseListHalves(L, A, 1) :- %if even
- count(L, Count),
- End is Count-1, Middle is End/2, Start is 0,
- sub(Start,Middle,L,Half1), sub(Middle,End,L,Half2),
- myReverse(Half1,Half1r), myReverse(Half2,Half2r),
- myConcat(Half1r,Half2r,A).
- count([], A) :- A is 0.
- count([_|L1b], A) :- count(L1b, A2), A is A2+1.
- sub(Start,End,L,A) :- sub(0,Start,End,L,A).
- sub(_,_,_,[],A).
- sub(Index,_,End,L,A) :- Index > End, A = [].
- sub(Index,Start,End,L,A) :- Index < Start, Index2 is Index+1, sub(Index2,Start,End,L,A).
- 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).
- getIndexInL(Index,L,A) :- getIndexInL(Index,0,L,A).
- getIndexInL(Index,Index,[A|_],A).
- getIndexInL(Index,X,[L1a|L1b],A) :- Index \= X, X2 is X+1, getIndexInL(Index,X2,L1b,A).
- myReverse([],L2) :- L2 = [].
- myReverse([L1a|L1b],A) :- myReverse(L1b, L2), myAppend(L2,L1a,A).
- myAppend([],X,[X]).
- myAppend([La|Lb],X,A) :- myAppend(Lb,X,A2), A = [La|A2].
- myConcat([],A,A).
- myConcat([L1a|L1b],L2,[L1a|A2]) :- myConcat(L1b,L2,A2).
- myFloor(Input,Output) :- myFloor(Input,Output,0).
- myFloor(Input,Index,Index) :- Index >= Input, Output is Index.
- myFloor(Input,Output,Index) :- Index < Input, Index2 is Index+1, myFloor(Input,Output,Index2).
Advertisement
Add Comment
Please, Sign In to add comment