рд╣рд╛рдп, рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХрд╛ рд╕рдореБрджрд╛рдп , рдореБрдЭреЗ рдХрд╛рдо рдЦрддреНрдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдореЗрд░реЗ рдкрд┐рдЫрд▓реЗ рдСрдкреНрд╕ рдореЗрдВ, рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрд▓ рдерд╛ рдХрд┐ рдкреНрд░реЛрд▓реЙрдЧ рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рдордЬрд╝реЗрджрд╛рд░ рд╣реЛрдЧрд╛ред рдЗрд╕реЗ рдПрдХ рд╡реНрдпрд╛рдпрд╛рдо рдореЗрдВ рдмрджрд▓ рджреЗрдВред
рдореИрдВ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рджрд┐рдЦрд╛рд╡рд╛ рдХрд░рдирд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
рдореИрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХреЛ рдпрд╛рдж рдХрд░рддрд╛ рд╣реВрдВ :
рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдорд┐рд▓рд╛рдирдПрдХ рдЗрдирдкреБрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧ (рдПрд╕) рдФрд░ рдПрдХ рдкреИрдЯрд░реНрди (рдкреА) рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдкреИрдЯрд░реНрди рдХреЛ ''? рдФрд░ ' 'ред
'?' рдХрд┐рд╕реА рдПрдХ рд╡рд░реНрдг рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред
' ' рд╡рд░реНрдгреЛрдВ рдХреЗ рдХрд┐рд╕реА рднреА рдХреНрд░рдо рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ (рдЦрд╛рд▓реА рдЕрдиреБрдХреНрд░рдо рд╕рд╣рд┐рдд)ред
рдорд┐рд▓рд╛рди рдкреВрд░реЗ рдЗрдирдкреБрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧ (рдЖрдВрд╢рд┐рдХ рдирд╣реАрдВ) рдХреЛ рдХрд╡рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╕рдорд╛рдзрд╛рди рдХреА рдкреВрд░реНрдгрддрд╛ рдХреЛ рд╕рд╛рдмрд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рдерд╛ред рд╕рд╛рдЗрдЯ рдкрд░ рдЬреЛ рдХрд╛рд░реНрдп рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЙрд╕рдореЗрдВ 1808 рдкрд░реАрдХреНрд╖рдг рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рддреБрд░рдВрдд рдирд╣реАрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЖрдкрдХреЛ рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд┐рдЦрдиреЗ рдФрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдХрдЯреНрдЯрд░, рдореБрдЭреЗ рдЙрд╕рд╕реЗ 66 рдорд┐рд▓реЗ рдФрд░ рдореЗрд░реЗ рдлреИрд╕рд▓реЗ рдХреЛ рдЬрд╛рдВрдЪрд╛ - рдЬрдмрдХрд┐ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рдпрд╣ рдЗрддрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ред
рдЗрддрдиреЗ рд╕рд╛рд░реЗ рдкрд░реАрдХреНрд╖рдг рдХреНрдпреЛрдВ, рдореИрдВ рдЖрдЧреЗ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ ...
рдореИрдВ рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреЛ рднрд╛рд╖рд╛ рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдмреЛрдзрдЧрдореНрдп рдЗрд╕ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдЙрдкрд▓рдмреНрдз (рд╡реЗ рдЖрдзреБрдирд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдХреА рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рдХреЛ рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВ)ред
рдЗрд╕рд▓рд┐рдП, рдкрд╛рдпрдерди рдХреЛ рдЪреБрдиреЗрдВред
рдкреНрд░реЛрд▓реЙрдЧ рдХреА рд╢рдХреНрддрд┐ рдЦреЛрдЬ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╣реИ, рдЬрд┐рд╕рдХреА рдЬрдбрд╝реЗрдВ рдкреНрд░рдореЗрдп рд╕рд╛рдмрд┐рдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдореЗрдВ рд╣реИрдВред рд╕реАрдзреЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдХрд╣реЗрдВ, рдЗрд╕рдореЗрдВ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдПрдХреАрдХрд░рдг рдФрд░ рд╡рд╛рдкрд╕реА рдХреЗ рд╕рд╛рде рдЦреЛрдЬ рддрдВрддреНрд░ рд╣реИред рдпрд╣ рдХрд╣рдирд╛ рдФрд░ рднреА рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдирд┐рд░реНрдгрдп рд╡реГрдХреНрд╖ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдзрд┐рдХ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдорд┐рд▓рд╛рди рдХрд┐рдпрд╛ рдЬрд╛рдПред
рдФрд░ рдкрд╛рдпрдерди рдЖрдзреБрдирд┐рдХ рдкрд╛рд╕реНрдХрд▓ рд╣реИ ("рдкреА" рдЕрдХреНрд╖рд░ рдХреЗ рд╕рд╛рде рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рддреАрди рднрд╛рд╖рд╛рдПрдВ рд╣реИрдВ), рдФрд░ рдЫрд╛рддреНрд░ рдЗрд╕ рдкрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ ред
рдЕрдм рдореИрдВ рдЙрд╕ рд╕рдорд╛рдзрд╛рди рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреВрдВрдЧрд╛ рдЬреЛ рдкрд┐рдЫрд▓реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдЬрд▓реНрджреА рд╕реЗ рд╡рд╛рдкрд╕реА рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╛рди рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛ рдЦреЛрдЬ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВред
рдЕрдЧрд▓рд╛, рдореИрдВ рдЗрд╕реЗ рдкрд░реАрдХреНрд╖рдг рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рд▓реЙрдиреНрдЪ рдХрд░реВрдВрдЧрд╛, рдФрд░ рдореИрдВ рджреЗрдЦреВрдВрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдХрджрдо (рдХреЛрдб) рд╕рд╣реА рдерд╛ред
рдЕрдм рд╕рдореНрдорд┐рд▓рд┐рдд рд╣реЛрдВред
рдЗрдирдкреБрдЯ рдкрд░, рдкрд░реАрдХреНрд╖рдг рд╕реНрдЯреНрд░рд┐рдВрдЧ рдФрд░ рдкреИрдЯрд░реНрди:
def test(st,pat): if st=="" and pat=="": yield True if pat>"" and pat[0]=='*':yield test(st,pat[1:]) if st>"" and pat>"": if st[0]==pat[0] or pat[0]=='?': yield test(st[1:],pat[1:]) if pat[0]=='*':yield test(st[1:],pat) yield False
рдпрд╣ рдкреНрд░реЛрд▓реЙрдЧ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рдорд╛рди рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ:
test_pattrn([],[]). test_pattrn([Ch|UnpTail],[Ch|PatTail]):-test_pattrn(UnpTail,PatTail). test_pattrn([Ch|UnpTail],['?'|PatTail]):-test_pattrn(UnpTail,PatTail). test_pattrn([Ch|UnpTail],['*'|PatTail]):-test_pattrn(UnpTail,['*'|PatTail]). test_pattrn(Str,['*'|PatTail]):-test_pattrn(Str,PatTail).
рдкрд╛рдВрдЪ рд╕рдорд╛рдзрд╛рди, рдЕрдиреНрдпрдерд╛ рдПрдХ рдЭреВрдаред
рд▓реЗрдХрд┐рди рд╡рд╛рдкрд╕реА рдХреЗ рд╕рд╛рде рдПрдХ рдЦреЛрдЬ рдХреИрд╕реЗ рдХрд░реЗрдВ? рдЗрд╕рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЙрдкрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдЬреИрд╕рд╛ рдХрд┐ рд╡рд╣рд╛рдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрдзреВрд░рд╛ (рдЖрд▓рд╕реА) рдЧрдгрдирд╛, рдмрдВрдж рдХрд░рдирд╛, рдХрд╛рд░реНрдпрд╛рддреНрдордХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдПрдХ рддрддреНрд╡, рдореБрдЭреЗ рдмрддрд╛рдУ ... рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд▓реМрдЯрд╛рдПрдЧрд╛ рдЬрд┐рд╕рд╕реЗ рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдорд╛рдзрд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдпрд╣ рдпрджрд┐ рдпрд╣ рд╕рд╣реА рдЙрддреНрддрд░ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЕрдЧрд▓реА рдЙрдкрдЬ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпрдХреНрд░рдо рд╢рд╛рдЦрд╛ рдореЗрдВ рдЬрд╛рдПрдВрдЧреЗ, рдпрд╣ рд░рд┐рдЯрд░реНрди рд╕реЗ рдЕрдВрддрд░ рд╣реИред
рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдкрд╣рд▓реЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдЧрд╛ () рдЕрдЧрд░ рдпрд╣ рд╕рдЪ рд╣реИ рддреЛ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдпрд╣ рдлрд┐рд░ рд╕реЗ рдкреБрдирд░рд╛рд╡реГрддреНрдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдЧрд╛, рдФрд░ рдкреНрд░реЛрд▓реЙрдЧ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд╕рдорд╛рди рдПрдХ рдЧрд╣рд░рд╛рдИ рдЦреЛрдЬ рд╣реЛрдЧреАред
рдпрд╣рд╛рдБ, рд╡рд╛рдкрд╕реА рдХреА рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдпрд╣рд╛рдБ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
def run(r): if type(r)==bool: if r==True: return True else: for nr in r: if run(nr):return True return False
1 рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ

рд╡рд╛рд╣, рдпрд╣ рдкрд░рд┐рдгрд╛рдо рд╣реИ, "939/1808 рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЗ рдкрд╛рд░рд┐рдд рд╣реБрдПред" рдФрд░ "рд╕реНрдерд┐рддрд┐: рд╕рдордп рд╕реАрдорд╛ рдкрд╛рд░ рд╣реЛ рдЧрдИ"ред
рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдореИрдВрдиреЗ рдЙрдореНрдореАрдж рдХреА рдереА, рдПрдХ рдШреЛрд╖рдгрд╛рддреНрдордХ рд╕рдорд╛рдзрд╛рди рд╣рдореЗрд╢рд╛ рд╕рдордп-рдХреБрд╢рд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдиреЗрддреГрддреНрд╡ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдкрд╛рд░рджрд░реНрд╢реА рд╢рдмреНрджрд╛рдВрдХрди рдПрдХ рддреНрд╡рд░рд┐рдд рд╢рдмреНрджрд╛рдВрдХрди рдирд╣реАрдВ рд╣реИред
рд▓реЗрдХрд┐рди, рдпрд╣рд╛рдВ рдЕрдЬрдЧрд░ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИ, рд╣рдо рдкрд╣рд▓реЗ рд▓реЗрдЦ рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдЦреЛрд▓реЗ рдЧрдП рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВрдЧреЗ, рдФрд░ рд╕рдордп рдХреЛ рдорд╛рдкреЗрдВрдЧреЗ:
import time pt=time.time() print(run(test("babaaababaabababbbbbbaabaabbabababbaababbaaabbbaaab","***bba**a*bbba**aab**b"))) print(time.time()-pt)
рдкрд╛рдпрдерди рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп 11.10963249206543 рд╕реЗрдХрдВрдб рд╣реИред рд▓реЗрдХрд┐рди рдереЛрдбрд╝рд╛ рдмрд╣реБрддред
рдкреНрд░реЛрд▓реЙрдЧ рдХреЗ рд▓рд┐рдП рдЙрдиреНрдирдд рдкрд░реАрдХреНрд╖рдг рдЗрдВрдЬрди:
%unit-tests framework assert_are_equal(Goal, false):-get_time(St),not(Goal),!,get_time(Fin),Per is Fin-St,writeln(Goal->ok:Per/sec). assert_are_equal(Goal, true):- get_time(St),Goal, !,get_time(Fin),Per is Fin-St,writeln(Goal->ok:Per/sec). assert_are_equal(Goal, Exp):-writeln(Goal->failed:expected-Exp). :-assert_are_equal(isMatch(aaabababaaabaababbbaaaabbbbbbabbbbabbbabbaabbababab,'*ab***ba**b*b*aaab*b'),true).
рдФрд░ рдпрд╣рд╛рдБ рдкреНрд░реЛрд▓реЙрдЧ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИ (рдСрдирд▓рд╛рдЗрди рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рдирд╣реАрдВ, рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ, рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреЗ рд╕рдорд╛рди рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдкрд░):
isMatch(aaabababaaabaababbbaaaabbbbbbabbbbabbbabbaabbababab,*ab***ba**b*b*aaab*b)->ok:2.208951950073242/sec
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЕрдЬрдЧрд░ рдХрд╛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ (рдФрд░, рдореБрдЭреЗ рдЗрд╕реЗ рд╕реБрдзрд╛рд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрд╣ рдЕрдм рдФрд░ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ:
def test(st,pat): if st==pat: return True if pat>"" and pat[0]=='*': if test(st,pat[1:]):return True if st>"" and pat>"": if st[0]==pat[0] or pat[0]=='?': if test(st[1:],pat[1:]):return True if pat[0]=='*': if test(st[1:],pat):return True return False import time pt=time.time() print(test("babaaababaabababbbbbbaabaabbabababbaababbaaabbbaaab","***bba**a*bbba**aab**b")) print(time.time()-pt)
рдпрд╣рд╛рдБ рдкрд░рд┐рдгрд╛рдо рд╣реИ: 3.921879768371582 рд╕реЗрдХрдВрдбред (рдпрд╣ рдореВрд▓ рдХреЗ рдХрд░реАрдм рд╣реИ)ред рд╣рдо рдордзреНрдпрд╕реНрде рдкрд░ рд▓реМрдЯрддреЗ рд╣реИрдВ:

рдФрд░ рдПрдХ рдмрд╛рд░ рдФрд░ред

рдореИрдВ рдпрд╣ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реВрдВ рдХрд┐ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХрд╛ рдХреБрд▓ рдорд╛рд░реНрдЧ рд╕рдордп рд╕реАрдорд╛ рд╕реЗ рдкрд░реЗ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдВрддрд┐рдо рджреЛ рд╡рд┐рдХрд▓реНрдк рдмрд╣реБрдд рдЬрд▓реНрджреА рд╣рд▓ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред
рд╣рдореЗрдВ рдкрд░рд┐рдорд╛рдг рдЕрдиреБрдХреВрд▓рди рдХреЗ рдЖрджреЗрд╢ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЪреЗрдХ 2. рд╣рдореЗрдВ рдЕрдиреБрдХреВрд▓рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдХреНрдпрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреАрдЦ рдорд╛рдБрдЧрддреА рд╣реВрдБ, рдпрд╣ рдкрд╣рд▓реА рдЦреЛрдЬ рд╣реИред
рдкреНрд░рддреНрдпреЗрдХ рд╢рд╛рдЦрд╛ рдХреЗ рдирд┐рд░реНрдгрдп рдХреЛ рддрдм рддрдХ рдЬрд╛рд░реА рди рд░рдЦреЗрдВ рдЬрдм рддрдХ рдХрд┐ рд╣рдо рдЭреВрда рди рдкрдХрдбрд╝реЗрдВ рдФрд░ рджреВрд╕рд░реА рд╢рд╛рдЦрд╛ рдореЗрдВ рди рд▓реМрдЯ рдЬрд╛рдПрдБ, рд▓реЗрдХрд┐рди рд╕реНрддрд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдгрдпреЛрдВ рдХреЛ рджреЗрдЦреЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдиреАрдЪреЗ рдЬрд╛рдПрдВ рдФрд░ рдзреАрд░реЗ-рдзреАрд░реЗ рдЖрдЧреЗ рдмрдврд╝реЗрдВред
рдореИрдВ рдЗрд╕реЗ рдПрдХ рдЕрдЬрдЧрд░ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдБрдЧрд╛, рдФрд░ рдлрд┐рд░ рдореИрдВ рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░реВрдБрдЧрд╛ред
def test(st,pat): if st==pat: return True res=[]
рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд░реАрдХреНрд╖рдг 939 рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдо рд╣реИ, рдХреЗрд╡рд▓ 0.01585698127746582 рд╕реЗрдХрдВрдбред
рдФрд░ ... рдпреВрдЖрд░рдП рдпрд╣ рдирд┐рд░реНрдгрдп рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛
рдореИрдВ рдПрдХ рдШреЛрд╖рдгрд╛рддреНрдордХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдЪреМрдбрд╝рд╛рдИ-рдкрд╣рд▓реА рдЦреЛрдЬ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рджрд┐рдЦрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд┐рд╢реЗрд╖ рджреВрд╕рд░реЗ рдХреНрд░рдо рдХреЗ рд╡рд┐рдзреЗрдп рд╣реИрдВ рдЬреЛ рд╕реВрдЪреА рдореЗрдВ рд╕рдорд╛рдзрд╛рди рдПрдХрддреНрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдмреИрдЧреЛрдлрд╝, рд╕реЗрдЯреЛрдлрд╝, рдлрд╛рдЗрдВрдбреЙрд▓ред
bagof (+ рдЯреЗрдореНрдкреНрд▓реЗрдЯ, рд▓рдХреНрд╖реНрдп: -рдмрд╛рдЧ)
рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд╕рд╛рде рдмреИрдЧ рдХреЛ рдПрдХреАрдХреГрдд рдХрд░реЗрдВред рдпрджрд┐ Goal рдХреЗ рдкрд╛рд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рдЭрд╛рдХрд░рдг рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдореБрдлреНрдд рдЪрд░ рд╣реИрдВ, рддреЛ bagof / 3 рдЗрди рдореБрдлреНрдд рдЪрд░ рдХреЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдкрд░ рдкреАрдЫреЗ рд╣рдЯ рдЬрд╛рдПрдЧрд╛, рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд╕рдВрдЧрдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд╕рд╛рде рдмреИрдЧ рдХреЛ рдПрдХреАрдХреГрдд рдХрд░рддрд╛ рд╣реИред рдХрдВрд╕реНрдЯреНрд░рдХреНрд╢рди + рд╡рд╛рд░ ^ рдЧреЛрд▓, рдмреИрдЧреЛ / 3 рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╡рд░ рдХреЛ рдЧреЛрд▓ рдореЗрдВ рди рдмрд╛рдВрдзреЗрдВред bagof / 3 рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ рдпрджрд┐ рд▓рдХреНрд╖реНрдп рдХрд╛ рдХреЛрдИ рд╣рд▓ рдирд╣реАрдВ рд╣реИред
рд╕реЗрдЯрдСрдл (+ рдЯреЗрдореНрдкреНрд▓реЗрдЯ, + рд▓рдХреНрд╖реНрдп,-рд╕реЗрдЯ)
рдмреИрдЧреЛрдлрд╝ / 3 рдХреЗ рдмрд░рд╛рдмрд░, рд▓реЗрдХрд┐рди рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХреЗ рдмрд┐рдирд╛ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рдХреНрд░рдордмрджреНрдз рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЙрд░реНрдЯ / 2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╕реЙрд░реНрдЯ рдХрд░реЗрдВред
рд╕реЗрдЯреЛрдл рдкреНрд░реЗрдбрд┐рдХреЗрдЯ рддрдм рд╕реЗ рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХреЛ рдХреИрд╕реЗ рдирд┐рдХрд╛рд▓рдирд╛ рд╣реИ (рдЕрдЬрдЧрд░ рдореЗрдВ, рдореБрдЭреЗ рд╕реЗрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реАрдЦрдирд╛ рдерд╛)ред
рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдПрдХ рд╡рд┐рдзреЗрдп рдмрдирд╛рддрд╛ рд╣реВрдВ рдЬрд┐рд╕реЗ рдПрдХ рд╕реНрддрд░ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓рддрд╛ рд╣реИ, рдлрд┐рд░ рдЗрд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рд╡рд┐рдзреЗрдп рдХреЗ рд╕рд╛рде рдПрдХрддреНрд░рд┐рдд рдХрд░реЗрдВ рдФрд░ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдЬрд╛рдПрдВ, рдпрд╣рд╛рдВ рдкреВрд░рд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ:
atom_to_list(Str,[Ch|T]) :- atom_concat(Ch,Rest,Str),atom_length(Ch,1), atom_to_list(Rest,T). % pattrn(X:X,true). %- pattrn([Ch|UnpTail]:[Ch|PatTail],UnpTail:PatTail). pattrn([_|UnpTail]:['?'|PatTail],UnpTail:PatTail). pattrn([_|UnpTail]:['*'|PatTail],UnpTail:['*'|PatTail]). pattrn(Str:['*'|PatTail],Str:PatTail). % true, , next_level(Lev):-member(true,Lev),!. next_level(Lev):-setof(One,SP^(member(SP,Lev),pattrn(SP,One)),Next),!, next_level(Next). test_pattrn(Str,Pat):-next_level([Str:Pat]). isMatch(S,P) :- atom_to_list(S,SL), atom_to_list(P,PL),!, test_pattrn(SL,PL),!. %unit-tests framework assert_are_equal(Goal, false):-get_time(St),not(Goal),!,get_time(Fin),Per is Fin-St, writeln(Goal->ok:Per/sec). assert_are_equal(Goal, true):- get_time(St),Goal, !,get_time(Fin),Per is Fin-St, writeln(Goal->ok:Per/sec). assert_are_equal(Goal, Exp):-writeln(Goal->failed:expected-Exp). %all test :-assert_are_equal(isMatch(aa,a),false). :-assert_are_equal(isMatch(aa,'*'),true). :-assert_are_equal(isMatch(cb,'?a'),false). :-assert_are_equal(isMatch(adceb,'*a*b'),true). :-assert_are_equal(isMatch(acdcb,'a*c?b'),false). :-assert_are_equal(isMatch(aab,'c*a*b'),false). :-assert_are_equal(isMatch(mississippi,'m??*ss*?i*pi'),false). :-assert_are_equal(isMatch(abefcdgiescdfimde,'ab*cd?i*de'),true). :-assert_are_equal(isMatch(zacabz,'*a?b*'),false). :-assert_are_equal(isMatch(leetcode,'*e*t?d*'),false). :-assert_are_equal(isMatch(aaaa,'***a'),true). :-assert_are_equal(isMatch(b,'*?*?*'),false). :-assert_are_equal(isMatch(aaabababaaabaababbbaaaabbbbbbabbbbabbbabbaabbababab,'*ab***ba**b*b*aaab*b'),true). :-assert_are_equal(isMatch(abbbbbbbaabbabaabaa,'*****a*ab'),false). :-assert_are_equal(isMatch(aaabababaaabaababbbaaaabbbbbbabbbbabbbabbaabbababab,'*ab***ba**b*b*aaab*b'),true). :-assert_are_equal(isMatch(babaaababaabababbbbbbaabaabbabababbaababbaaabbbaaab,'***bba**a*bbba**aab**b'),false).
рдпрд╣рд╛рдВ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкрд╣рд▓реЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рджреНрд╡рд╛рд░рд╛ рдЦреЛрдЬ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдирд┐рдпрдо, рдЬреИрд╕реЗ рдХрд┐ рдЧреНрд░рд╛рдлрд╝ рдореЗрдВ рдЪреЗрд╣рд░реЗ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрдХреНрд░рдордг рдмрдирд╛ рд░рд╣рд╛ рд╣реИ, рдЕрдм рддрдереНрдпреЛрдВ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдореЗрдВ рдмрджрд▓ рдЧрдпрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рдВрднрд╡ рд╕рдВрдХреНрд░рдордг (рд░рд╛рдЬреНрдпреЛрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдз) рд╢рд╛рдорд┐рд▓ рд╣реИрдВ - рдпрд╣ рдЧреНрд░рд╛рдлрд╝ рдХрд╛ рд╡рд┐рд╡рд░рдг рд╣реИ, рдФрд░ рдРрд╕рд╛ рдХреЛрдб рдирд╣реАрдВ рдЬреЛ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред
рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рд╕реЗрдХрдВрдб рдореЗрдВ рд╕рдордп рдХреЗ рд╕рд╛рде рд╣реЛрддрд╛ рд╣реИ:
isMatch(aa, a)->ok:0.00010013580322265625/sec isMatch(aa, *)->ok:4.00543212890625e-5/sec isMatch(cb, ?a)->ok:3.981590270996094e-5/sec isMatch(adceb, *a*b)->ok:0.0001399517059326172/sec isMatch(acdcb, a*c?b)->ok:9.989738464355469e-5/sec isMatch(aab, c*a*b)->ok:4.00543212890625e-5/sec isMatch(mississippi, m??*ss*?i*pi)->ok:0.0003399848937988281/sec isMatch(abefcdgiescdfimde, ab*cd?i*de)->ok:0.0003600120544433594/sec isMatch(zacabz, *a?b*)->ok:9.989738464355469e-5/sec isMatch(leetcode, *e*t?d*)->ok:0.00020003318786621094/sec isMatch(aaaa, ***a)->ok:9.989738464355469e-5/sec isMatch(b, *?*?*)->ok:6.008148193359375e-5/sec isMatch(aaabababaaabaababbbaaaabbbbbbabbbbabbbabbaabbababab, *ab***ba**b*b*aaab*b)->ok:0.0040400028228759766/sec isMatch(abbbbbbbaabbabaabaa, *****a*ab)->ok:0.0006201267242431641/sec isMatch(aaabababaaabaababbbaaaabbbbbbabbbbabbbabbaabbababab, *ab***ba**b*b*aaab*b)->ok:0.003679990768432617/sec isMatch(babaaababaabababbbbbbaabaabbabababbaababbaaabbbaaab, ***bba**a*bbba**aab**b)->ok:0.002460002899169922/sec
рдФрд░ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╕рдлрд▓ рд╕рдорд╛рдзрд╛рди рд╣реИ, рди рдХреЗрд╡рд▓ рддрд╛рд░реНрдХрд┐рдХ рд░реВрдк рд╕реЗ рдмрд▓реНрдХрд┐ рд╕рдордп рдореЗрдВ рднреАред
рдирд┐рд╖реНрдХрд░реНрд╖
рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдПрдХ рдШреЛрд╖рдгрд╛рддреНрдордХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╡рд┐рд╖рдп рдореЗрдВ рд░реБрдЪрд┐ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рд╡рд┐рд╖рдп "рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг niasilil" рддреБрд░рдВрдд рдЦреЛрд▓рд╛, рд▓реЗрдХрд┐рди рдмреНрдпрд╛рдЬ рдЕрднреА рднреА рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдореИрдВрдиреЗ рджрд┐рдЦрд╛рдпрд╛ рдХрд┐ рдкреНрд░рджрд░реНрд╢рди рдХреА рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдЬреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рд╡рд╣ рдЬрд▓реНрджреА рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдПрдХ рд╕рдорд╛рдирд╛рдВрддрд░ рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛ рдмрдирд╛рдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕ рдЕрд╕рдлрд▓ рд░рд╣реЗред рд╢рд╛рдпрдж рдпрд╣рд╛рдБ рднрд╡рд┐рд╖реНрдп рдХрд╛ рд╕рд╡рд╛рд▓ рд╣реИ, рдХреНрдпрд╛ рдХреНрд╡рд╛рдВрдЯрдо рдХрдВрдкреНрдпреВрдЯрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ ??
рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░ рд╣рдо рдПрдХ рд╕реБрдЦрдж рд╢рдЧрд▓ рдХреЗ рд▓рд┐рдП рдЙрдкрд░реЛрдХреНрдд рд╕рд╛рдЗрдЯ рдкрд░ рдкрд╣реЗрд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдмреБрджреНрдзрд┐рдорд╛рдиреА рд╕реЗ рдХрд░рддреЗ рд╣реИрдВред
рдЦреИрд░, рдЕрдЧрд▓реА рдмрд╛рд░, рдПрдХ рдФрд░ рдХрдард┐рди рдХрд╛рд░реНрдп рдХреЛ рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред