Skip to content

Instantly share code, notes, and snippets.

@rolph-recto
Created December 21, 2013 01:28
Show Gist options
  • Save rolph-recto/8064247 to your computer and use it in GitHub Desktop.
Save rolph-recto/8064247 to your computer and use it in GitHub Desktop.
Chapter 6 Exercises from Learn Prolog Now! by Blackburn and Bos
% chapter6.pl
append2([], L, L).
append2([X|T], L2, [X|L3]) :- append(T, L2, L3).
prefix(P, L) :- append2(P, _, L).
suffix(S, L) :- append2(_, S, L).
sublist(Sub, L) :- suffix(S, L), prefix(Sub, S).
reverse2([], []).
reverse2([X|T], Y) :- reverse2(T, Z), append2(Z, [X], Y).
reverse3(L, R) :- reverse3(L, [], R).
reverse3([X|TX], A, R) :- reverse3(TX, [X|A], R).
reverse3([], Acc, Acc).
% exercise 6.1
doubled(L) :- append2(X, X, L).
% exercise 6.2
palindrome(L) :- reverse3(L, L).
% exercise 6.3.1
second(X, [_, X|T]).
% exercise 6.3.2
swap12([X,Y|T], [Y,X|T]).
swap12([], []).
swap12([X], [X]).
% exercise 6.3.3
final(X, L) :- reverse3(L, [X|_]).
% exercise 6.3.4
% toptail : reverse the tail, then reverse the tail of that
toptail([X|T], Out) :- reverse3(T, [Y|OutR]), reverse3(OutR, Out).
% exercise 6.3.5
swapfl(L1, L2) :-
L1 = [X|TX],
toptail(L1, B),
toptail(L2, B),
final(X, L2).
% exercise 6.4
colors(L) :- member(red, L), member(blue, L), member(green, L).
nationalities(L) :- member(england, L), member(spain, L), member(japan, L).
pets(L) :- member(jaguar, L), member(snail, L), member(zebra, L).
% rightOf: elem A is to the right of B in list L
rightOf(A, B, L) :-
prefix(P, L),
final(A, P),
member(B, P).
% leftOf: elem A is to the left of B in list L
leftOf(A, B, L) :-
suffix(P, L),
P=[A|_],
member(B, P).
street(L) :-
L=[house(C1, N1, P1), house(C2, N2, P2), house(C3, N3, P3)],
colors([C1, C2, C3]),
nationalities([N1, N2, N3]),
pets([P1, P2, P3]),
member(house(red, england, _), L),
member(house(_, spain, jaguar), L),
rightOf(house(_, japan,_ ), house(_, _, snail), L),
leftOf(house(_, _, snail), house(blue, _, _), L).
zebra(N) :- street(L), member(house(_, N, zebra), L).
@controlbounding
Copy link

what about exercise 6.3.4 with append as it states in the hint

@mmsrubar
Copy link

This toptail([_|Xs],Outlist) :- append(Outlist,[_],Xs). could be a possible solution.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment