2番目と3番目の引数が最初の引数であるリスト内で同じように頻繁に発生する場合は、occurrences/5を書くことができます。第4引数と第5引数は対応するカウンタです。そして、述語個/ 1には、呼び出し元の述語です:
occurrences(List) :-
occurrences(List,a,b,0,0).
occurrences([],_A,_B,N,N).
occurrences([A|Xs],A,B,N0,M) :-
N1 is N0+1,
occurrences(Xs,A,B,N1,M).
occurrences([B|Xs],A,B,N,M0) :-
M1 is M0+1,
occurrences(Xs,A,B,N,M1).
occurrences([X|Xs],A,B,N,M) :-
dif(A,X),
dif(B,X),
occurrences(Xs,A,B,N,M).
あなたは0でカウンターを開始し、対応するカウンタがインクリメントされるか、何のカウンターがあればインクリメントされていないA
またはB
に等しいリストの先頭に応じて、頭は両方とも異なっている。今度は、あなたの挙げた例の結果を見てみましょう:
?- occurrences([a,a,b,b]).
true ;
false.
?- occurrences([a,a,a,b,b]).
false.
は、しかし、私はあなたが2つの要素を指定することができます述語個/ 3がより有用であろうと思う:
occurrences(List,A,B) :-
dif(A,B),
occurrences(List,A,B,0,0).
次にあなたの例ではなりを問い合わせます次のようになります。
?- occurrences([a,a,b,b],a,b).
true ;
false.
?- occurrences([a,a,a,b,b],a,b).
false.
あなたはまた同じように頻繁に発生する要素を求めることができる:
?- occurrences([a,a,b,b,c,c,d],X,Y).
X = a,
Y = b ;
X = a,
Y = c ;
X = b,
Y = a ;
X = c,
Y = a ;
X = b,
Y = c ;
X = c,
Y = b ;
dif(X, d),
dif(X, c),
dif(X, c),
dif(X, b),
dif(X, b),
dif(X, a),
dif(X, a),
dif(X, Y),
dif(Y, d),
dif(Y, c),
dif(Y, c),
dif(Y, b),
dif(Y, b),
dif(Y, a),
dif(Y, a).
最後の解決策は、両方が等しく頻繁に出現する、すなわち0回であるので、リストに全く現れない2つの要素に対応する。述語を他の方向に使用する場合、つまり、2つの要素が同じように頻繁に表示されるようなリストがあるかどうかを調べるには、述語の時間にリストの長さを制限しているゴールに接頭辞を付ける必要があります例えば、呼び出し:
?- length(L,_),occurrences(L,a,b).
L = [] ;
L = [_G150],
dif(_G150, b),
dif(_G150, a) ;
L = [a, b] ;
L = [b, a] ;
L = [_G116, _G119],
dif(_G116, b),
dif(_G116, a),
dif(_G119, b),
dif(_G119, a) ;
L = [a, b, _G162],
dif(_G162, b),
dif(_G162, a) ;
L = [a, _G159, b],
dif(_G159, b),
dif(_G159, a) ;
L = [b, a, _G162],
dif(_G162, b),
dif(_G162, a) ;
.
.
.
「a」と「b」以外の要素もありますか? – false
aとbだけはありません。 – Nona
*は等しく表示されます*あなたも*連続的に*を意味しますか?つまり、 '[a、b、a、b]'は成功するのでしょうか? – lurker