3

文字列に文字が含まれているかどうかを確認したい。Atom文字列と文字もそうですChnameASCIIコードに従って数値のリスト内の文字列を変換する述語です。

find_elementX要素がリストの一部である場合にのみ真であると想定される述語です。正確に要素が見つかったC場所を示すカウンターです。X

これは私が得ている結果です:

?- exists(prolog,g). [103][112,114,111,108,111,103] false.

-------> 103は文字「g」のASCIIコードであり、リスト[112,114,111,108,111,103]は文字列「prolog」を表すリストです。質問exists(prolog,g)は本当の答えを提供するはずでした。

ただし、find_element述部は正しく機能しています。たとえば入力すると、なぜこれが発生するのかわかりません

?- find_element(5,[3,4,5,6,5,2],X).

取得していますX= 3 ; X = 5 ; false. ---->

5はリストの3番目と5番目の要素であることがわかるので、これは絶対に問題ありません。

したがって、問題は、次のfind_elementように入力すると機能する?- find_element(5,[3,4,5,6,5,2],X)ことですが、述語exists(を呼び出すfind_element)を呼び出そうとすると機能しません。

これはコードです:

find_element(X,[X|T],1).

find_element(X,[H|T],C):- find_element(X,T,TEMPC), C is TEMPC +1.

exists(Atom,Ch):- name(Atom,[X|T]), name(Ch,Z), write(Z), write([X|T]), find_element(Z,[X|T],Count).

前もって感謝します

4

1 に答える 1

2

私はあなたのコードを少しきれいにし、バグを修正しました:

find_element(X,[X|_], 1).
find_element(X,[_|T], C) :-
    find_element(X,T,TEMPC),
    C is TEMPC +1.

exists(Atom, Ch):-
    name(Atom, L),
    name(Ch, [Z]),
    find_element(Z, L, _Count).

name(Ch, [Z])単一の文字を抽出することに注意してください。今

?- exists(pippo,o).
true

注目に値するのは、

?- find_element(3, [1,2,3,4,1,2,3,4],P).
P = 3 ;
P = 7 ;
false.

?- nth1(P, [1,2,3,4,1,2,3,4], 3).
P = 3 ;
P = 7 ;
false.

find_element/3 は nth1/3 のように動作し、引数 1 と 3 が入れ替わっています。

もちろん、このようなテストを実行するためのより簡単で一般的な方法があります。sub_atom /5 のような ISOビルトインの使用 (アトム検査のための非常に強力なプリミティブ)

?- sub_atom(pippo, _,_,_, o).
true ;

または memberchk/2、既に知っている文字リストへの変換後 (ただし、ISO 組み込みの atom_codes /2 を使用)

exists(Atom, Ch):-
    atom_codes(Atom, L),
    atom_codes(Ch, [Z]),
    memberchk(Z, L).

sub_atom の出現回数をカウントするには、library(aggregate) を使用できます

occurences(Atom, Ch, N) :-
  aggregate_all(count, sub_atom(Atom, _,_,_, Ch), N).

?- occurences(pippo, p, X).
X = 3.
于 2012-12-17T20:18:29.870 に答える