% terms are either: % atoms: % green, sokrates, appl3, ',' % variables: % X, Xs, _ , _Argument % functions applied to arguments (functors) % human(sokrates), human(X), cons(Head, Tail) % facts colour(green). colour(red). % rules. colour(X) :- X = green ; X = red. colour(X) :- X = green ; X = red. human(sokrates). human(plato). human(aristoteles). % Think about ':-' as a reversed implication arrow '<-' mortal(X) :- human(X). adjacent(a, b). adjacent(b, c). adjacent(c, d). adjacent(d, a). connected(X, Y) :- adjacent(X, Y). connected(X, Y) :- adjacent(Y, X). % member(X, L) : true if X is a member of L memberP(X , [X | _]). memberP(X , [H | T]) :- dif(X, H), memberP(X, T). % appendP(Xs, Ys, Zs) : true if Zs is the concat of Xs and Ys myReverse([], []). myReverse([H | T], Ys) :- myReverse(T, Tr), append(Tr, [H], Ys). myReverseAcc(Xs, Ys) :- myReverseAcc(Xs, [], Ys). myReverseAcc([], X, X). myReverseAcc([H | T], Acc, Ys) :- myReverseAcc(T, [H | Acc], Ys). %myDelete(X, L, R) holds if R is the list where all occurences of X have been removed myDelete(_ , [], []). myDelete(X , [X | T], R ) :- myDelete(X, T, R). myDelete(X, [H | T], [H | R]) :- dif(X, H), myDelete(X, T, R). removeDuplicates([], []). removeDuplicates([H | T], [H | Ys]) :- myDelete(H, T, R), removeDuplicates(R, Ys). % takeout(X, L, R) holds if R is the list where the first occurence of X in L (that must exist) is removed. % alternatively: holds if L is a list that is the result of inserting X somewhere in R. takeout(X, [X | T], T). takeout(X, [H | T], [H | Ys]) :- dif(X, H), takeout(X, T, Ys). myPermutations([], []). myPermutations([H | T], Ys) :- myPermutations(T, T1), takeout(H, Ys, T1). % Collect all solutions to myPermutations([a,b,c], X) in a list Xs: % ?- findall(X, myPermutations([a,b,c], X), Xs).