CLP(FD) を使用せずに、問題と制約を適切に表現する Prolog の組み合わせ機能を使用する必要があります。例えば
puzzle(Name) :-
    L = [[mason, Pos1, Blond1, Handsome1, UnScared1],
         [alex,  Pos2, Blond2, Handsome2, UnScared2],
         [steve, Pos3, Blond3, Handsome3, UnScared3],
         [simon, Pos4, Blond4, Handsome4, UnScared4]
        ],
   permutation([1,2,3,4], [Pos1,Pos2,Pos3,Pos4]),
   maplist(yn,
       [Blond1, Handsome1, UnScared1,
        Blond2, Handsome2, UnScared2,
        Blond3, Handsome3, UnScared3,
        Blond4, Handsome4, UnScared4
       ]),
...
各変数 (大文字で始まる記号!) は個人の属性であり、ドメインからの値を想定できます。yn/1 これはサービス ファクトであり、これらのバイナリ値が yes または no のいずれかを想定できるようにします。
yn(y).
yn(n).
制約は次のように表現できます (最初の例のみ)。
...
   % Two of them who are not blond are standing on either side of Mason.
   member([mason, I1, _,_,_], L),
   member([_,     I2, n,_,_], L),
   member([_,     I3, n,_,_], L),
   (I2>I1, I3>I1 ; I2<I1, I3<I1),
...
そして解決策は
   % One of them is blond, handsome, and unscarred.
   member([Name,  _, y, y, y], L).
すべての制約 (英語) を理解しているかどうかはわかりません。実際、私のプログラムは解決策を見つけられません。
プログラムはかなり遅く、CLP(FD) を呼び出します。CLP(FD) ソリューションに興味がある場合は、質問を編集します (たとえば、適切なタグを追加します)。