>>531
> enumber([H|T],E) :- H = edge(N,[M|Ms]), enumber([H1|T],E1), E1 is E+1, H1 = edge(N,Ms).

この部分、どうやって呼ばれるか考えてみた?
E が何にも単一化されてない変数の状態で呼ばれるんだよね。
その状態じゃ E+1 なんて計算はできない。

っていうか、 enumber([H1|T],E1) が成功してきたなら、 E1 は数値に単一化されてるよね。
単に逆なんじゃ?

あと、 H1 を edge(N,Ms) に単一化するのが遅すぎ。
enumber([H1|T],E1) より先に単一化しとかなきゃ、変数を含んだリストに対して enumber を計算することになる。