まずは手続き型プログラミングの延長で考えよう
たとえば値 x とy の最大値を求める関数 max(x, y) を疑似コードで書くと:
 max(x, y) = if x > y then z := x else z := y; return z
これを Prolog では:
 max(X, Y, Z) ;- X > Y, !, Z = X.
 max(_, Y, Z) ;- Z = Y.
と書けるけど、一般にはより簡潔に以下のように書く:
 max(X, Y, X) ;- X > Y, !.
 max(_, Y, Y).
ここで、カット "!" は条件式と以降の文との間に置く "then" と見る

ここまでは(手続き型における)「分岐」のパターンになるけど、
手続き型の「反復」を Prolog では「再帰」で書くから、
「再帰の書き方(=再帰的定義)」に慣れることが最初の壁になる
たとえば数のリストについて、各値を +1 する述語 list_succ は:
 list_succ([X|XS], [Y|YS]) ;- Y is X + 1, !, list_succ(XS, YS).
 list_succ([], []).
と書き、同様に偶数だけを抽出する述語は:
 list_even([X|XS], [X|YS]) ;- is_even(X), !, list_even(XS, YS).
 list_even([_|XS], YS) ;- list_even(XS, YS).
 list_even([], []).

こういった手続き型プログラミングと共通する概念とその書き方に慣れてから、
Ptolog 固有の「単一化」や「バックトラッキング」といった概念を学ぶといい