#module // 文字列への参照を作る関数 #define global ctype ref_xs(%1) \ %t__ref %i0 \ %p@__ref(ref_xs_@__ref(%1, %p@__ref)) \
// 例1 // '}'が内側のifに対応すると判断される。 // '}' の前に改行があると問題なし if 1 { if 1 : mes "a" : else : mes "b" } mes "c"
% can_unify/2 % 「can_unify(X, Y) が成功する」⇔「X = Y が成功する」、ただし単一化は行われない。 can_unify(X, Y) :- setof(Z, (Z = X, X = Y), [_|_]).
% テストデータ ls([a:1, a:1, a:2, b:2]). % 定義1 - 等号の失敗を使って排除 remove_v1(_, [], []).
natural(0). natural(s(N)) :- natural(N). natural(0, 0). natural(s(N), X) :- number(X), !, X > 0, X1 is X - 1, natural(N, X1). % N によって変項 X を単一化させる場合
mylength([], 0). mylength([_|T], N) :- mylength(T, N1), N is N1 + 1. 零リスト([]). 零リスト([0|T]) :- 零リスト(T).
順列(Y,0,[]). 順列(Y,N,[A|X]) :- del(A,Y,Z), M is N - 1, 順列(Z,M,X). del(A,[A|X],X). del(A,[B|X],[B|Y]) :- del(A,X,Y).
remove1(E, [E|Tail], Tail). remove1(E, [X|Tail], [X|List]) :- remove1(E, Tail, List). permutation([], []). permutation(List, [H|Tail]) :- remove1(H, List, List1), permutation(List1, Tail).