4

Prologの学習を始めています。このプログラムは、指定された要素のすべての出現を取得しようとします:

occurences(_, [], Res):- Res is [].
occurences(X, [X|T], Res):- 
    occurences(X,T,TMP),
    Res is [X,TMP].
occurences(X, [_|T], Res):- occurences(X,T,Res).

しかし、ここにエラーがあります:

?- occurences(a,[a,b,c,a],Res).
ERROR: is/2: Arithmetic: `[]/0' is not a function
^  Exception: (11) _G525 is [] ? creep
   Exception: (10) occurences(a, [], _G524) ? creep
   Exception: (9) occurences(a, [a], _G524) ? creep
   Exception: (8) occurences(a, [c, a], _G524) ? creep
   Exception: (7) occurences(a, [b, c, a], _G524) ? creep
   Exception: (6) occurences(a, [a, b, c, a], _G400) ? creep
4

3 に答える 3

5

他の人が書いたことに加えて、 dif/2 制約の使用を検討してください。

occurrences(_, [], []).
occurrences(X, [X|Ls], [X|Rest]) :-
        occurrences(X, Ls, Rest).
occurrences(X, [L|Ls], Rest) :-
        dif(X, L),
        occurrences(X, Ls, Rest).

次のように、すべての方向で述語を使用できるようになりました。

?- occurrences(X, [a,a,b], Os).
X = a,
Os = [a, a] ;
X = b,
Os = [b] ;
Os = [],
dif(X, b),
dif(X, a),
dif(X, a) ;
false.

a最後の解決策は、 X が および の両方と異なる場合、出現リストが空であることを意味しbます。

于 2012-12-01T20:27:40.400 に答える
1

あなたはすでにルーベンスからあなたの間違いについて忠告されています。スタイルノートを追加するだけです。多くの場合、Prologでは、ヘッド引数にパターンを直接コーディングすることが推奨されます。

occurences(_, [], []).
occurences(X, [X|T], [X|TMP]) :- 
    occurences(X,T,TMP), !.
occurences(X, [_|T], Res) :-
    occurences(X,T,Res).

[X,TMP]2番目の句「output」をからに修正し[X|TMP]、カットに注意してください。これがないと、プロシージャは必要以上の結果を生成します。

?- occurences(a,[a,b,c,a],Res).
Res = [a, a] ;
Res = [a] ;
Res = [a] ;
Res = [] ;
false.

カット付き:

?- occurences(a,[a,b,c,a],Res).
Res = [a, a].

@falseを編集すると、厄介なバグが台無しになります。ここでは、if / then/else構文を使用して修正します。

occurences(_, [], []).
occurences(X, [Y|T], Os) :-
    (   X = Y
    ->  Os = [X|R]
    ;   Os = R
    ),
    occurences(X,T,R).
于 2012-12-01T19:47:03.313 に答える
0

検討:

occurrences(_, [], []) :- !.
occurrences(X, [Y|L], R) :-
    X \== Y, !,
    occurrences(X, L, R).
occurrences(X, [Y|L], [Y|R]) :-
    occurrences(X, L, R).

テスト:

?- occurrences(a,[a,b,a,c],O).
O = [a, a].

?- occurrences(a,[a,X,a,c],O).
O = [a, a].

?- occurrences(a,[a,X,a,c],[a]).
false.

?- occurrences(a,[a,X,a,c],[a,a]).
true.
于 2012-12-12T03:34:00.267 に答える