このディレクトリの索引
% ユーティリティ述語 sub_atom/10 の提案
%
% A .. 文字列 (atom)
% S .. 検索文字列開始変位 (integer)
% L .. 検索文字列の長さ (integer)
% R .. 残り長さ (integer)
% H .. 検索文字列より前側の文字列 (atom)
% X .. 検索文字列 (atom)
% T .. 検索文字列より後の残り文字列 (atom)
% HL .. 検索文字列より前側の文字ならび (chars)
% XL .. 検索文字列文字ならび (chars)
% TL .. 検索文字列より後の残り文字ならび (chars)
% A がvarである時はH-HL,X-XL,T-TLの3組の中にvar-varの組があってはなりません。 

sub_atom_12(A,W1,W2,S,L,R,H,X,T,HL,XL,TL) :-
        '文字列W1から始まりW2で終わる。W1,W2の間にW1,W2は現れない'(A,V,W,S,L,R,H,X,T,HL,XL,TL).

'文字列W1から始まりW2で終わる。W1,W2の間にW1,W2は現れない'(A,W1,W2,S,L,R,H,X,T,HL,XL,TL) :-
        sub_atom(A,S,L,R,H,X,T,HL,XL,TL),
        文字列W1から始まりW2で終わる(X,W1,W2,S1,S2),
        'W1,W2の間の文字列にW1,W2は現れない'(X,S1,S2,W1,W2).

文字列W1から始まりW2で終わる(X,W1,W2,S1,S2) :-
        sub_atom(X,0,S1,_,W1),
        sub_atom(X,S2,_,0,W2).

'W1,W2の間の文字列にW1,W2は現れない'(X,W1,W2,S1,S2) :-
        sub_atom(X,S1,_,S2,_W1とW2の間の文字列),
        \+(sub_atom(_W1とW2の間の文字列,_,_,_,W1)),
        \+(sub_atom(_W1とW2の間の文字列,_,_,_,W2)).

count(P,N) :-
        findsum(1,P,F),
        N is truncate(F).

findsum(_選択項,_項,_合計値) :-
        findall(_選択項,_項,_値ならび),
        sum(_値ならび,_合計値),!.

sum([],0).
sum([N|R],S) :-
        sum(R,S1),
        S is N + S1.

sub_atom(A,S,L,R,H,X,T,HL,XL,TL) :-
    atom(A),
    !,
    sub_atom(A,S,L,R,X),
    sub_atom(A,0,S,_,H),
    N is S + L,
    sub_atom(A,N,R,_,T),
    atom_chars(H,HL),
    atom_chars(X,XL),
    atom_chars(T,TL).

sub_atom(A,S,L,R,H,X,T,HL,XL,TL) :-
    var(A),
    !,
    atom_chars(H,HL),
    atom_chars(X,XL),
    atom_chars(T,TL),
    length(HL,S),
    length(XL,L),
    length(TL,R),
    concat_atom([H,X,T],A),
    sub_atom(A,S,L,R,H,X,T,HL,XL,TL).