6

Prolog の正規表現について少し学ぶために、入力がパターンに適合するかどうかを判断する関数を作成しようとしています。私の機能は次のとおりです。

split(W, [[], W]).

split([X|W], [[X|W1], W2]) :- split(W, [W1, W2]).

match(eps, []).
match(symb(A), [ A ]).
match(union(R1, R2), W) :- match(R1, W).
match(union(R1, R2), W) :- match(R2, W).
match(conc(R1, R2), W)  :- split(W, [W1, W2]), W1 \= [], W2 \= [], match(R1, W1), match(R2, W2).
match(star(R), W)       :- match(R, eps).
match(star(R), W)       :- split(W, [W1, W2]), W1 \= [], match(R, W1), match(star(R), W2).

SWIPL に次のように入力すると、次の結果が得られます。

?- match(star(symb(a)),[a,a,a,a]).
false.

?- match(star(symb(b)),[b]).
false.

私が知る限り、他の機能は正しく機能しています。スターの扱いでどこが間違っていたのか誰か教えてもらえますか?

ありがとうございました!

4

1 に答える 1

0

ああ、私がばかだと気にしないでください。変更する必要がありました

match(star(R), W) :- match(R, eps).

ただ

match(star(R), []).

ベースケースがなかったので、スタックオーバーフローが発生し続けました。生きて学ぶと思います!

于 2012-11-09T03:47:20.083 に答える