ãã®ç¯ã§ã¯Regoã§ããªã·ãŒãèšè¿°ããéã«ã¯ãŸããã¡ãª "Safety" ã®æŠå¿µã«ã€ããŠè§£èª¬ããŸãïŒå ¬åŒããã¥ã¡ã³ãïŒã
rego_unsafe_var_error: var x is unsafe
Regoã§ããªã·ãŒã®èšè¿°ãå§ãããšãããã1床ã¯ééããã§ããããšã©ãŒã§ããäŸãã°ä»¥äžã®ãããªããªã·ãŒããã®ãšã©ãŒã«ãªããŸãã
package example
p := {
"blue": 1,
"red": 0,
"yellow": 2,
}
result[x] {
not p[x] == 0
}
% opa eval -b . data
{
"errors": [
{
"message": "var x is unsafe",
"code": "rego_unsafe_var_error",
"location": {
"file": "example.rego",
"row": 9,
"col": 5
}
}
]
}
OPAã¯ã«ãŒã«ãæéåã®å ¥åãšåºåãæã€ããšãä¿èšŒããããã« Safety ãšããæŠå¿µãæã£ãŠããŸããã¡ãããšå®çŸ©ããã倿°ã®ã¿ãè©äŸ¡ã«çšããããšã§ãçµæãåæããããã«ããããã®ä»çµã¿ã§ããããã¥ã¡ã³ãã§ã¯ "Safety" ã¯ä»¥äžã®ããã«å®çŸ©ãããŠããŸãã
Safety: every variable appearing in the head or in a builtin or inside a negation must appear in a non-negated, non-builtin expression in the body of the rule.
headãšã¯ {...}
ã§å²ãããã«ãŒã«ã®å€ã§ãäžèšäŸã ãš p
ããã³ result[x]
ããã®é åã«ããããšã«ãªããŸããbuiltinã¯çµã¿èŸŒã¿ã§çšæãããŠããããŒã¯ãŒãã颿°ïŒäŸãã° with
ãªã©ïŒãnegation㯠not
ãæããŠããŸãããããã«äœ¿ããã倿°ã¯ãã¹ãŠ
-
not
ã䜿ããªãåŒ - çµã¿èŸŒã¿ããŒã¯ãŒãã颿°ä»¥å€ã®åŒ
ã®ã©ã¡ããã§å®çŸ©ãããŠããå¿
èŠãããããšããããšã«ãªããŸããéã«èšããš not
ã®åŒãbuiltinããŒã¯ãŒãã䜿ãåŒã§ã¯ 倿°ã決å®ãããã«ãŒã«ãå®å
šã«è©äŸ¡ã§ããªã ãšã¿ãªãããŠãšã©ãŒã«ãªãããšããã±ãŒã¹ãå€ããšæããŸãã
äŸãã°å
çšã®ããªã·ãŒã ãš x
ãåãããå€ã¯ blue
, red
, yellow
ã®3ã€ã®ã¿[1]ã§ããã not x == 0
ãšã ãèšè¿°ãããå Žåã0
以å€ã®ç¡æ°ã®å€ãåãããäºã«ãªã£ãŠããŸããŸãããŸãçµã¿èŸŒã¿ã®é¢æ°ãããŒã¯ãŒããšã ãçµã¿åããã倿°ãæªå®çŸ©ã®ãã®ãšããŠæ±ãããã®ã§ãåæ§ã«ç¡æ°ã®å€ãåãåŸãŸããå
è¿°ãããšããOPAã¯æéã®çµæãè¿ãããšãä¿èšŒããããã倿°ã®å®å
šæ§ãæ€èšŒã§ããªãã£ãå Žå㯠unsafe
ã®ãšã©ãŒãåºåããŠåŠçãäžæããŸãã
å ·äœçãªãšã©ãŒã®äŸ
ãšãã説æã ãã ãšãªããªãçè§£ãã¥ãããšæãã®ã§ãå ·äœçãªäŸãšè§£æ±ºæ¹æ³ãèŠãŠãããããšæããŸãã
äžèŽããªãèŠçŽ ãæãåºããã
ãšã©ãŒã«ãªãäŸ
p := {
"blue": 1,
"red": 0,
"yellow": 2,
}
result[x] {
not p[x] == 0
}
çŽæçã«ã¯å€ã 0
ã§ã¯ãªãããŒãã€ãŸã blue
ãš yellow
ãæãåºãããã§ãããåè¿°ãããšãã p
ã«ã©ã®ãããªå€ãå
¥ãããæ±ºå®çã§ã¯ãªãããã x
ãunsafeãªå€æ°ãšããŠæ±ãããšã©ãŒã«ãªããŸãã
è§£æ±ºæ¹æ³
result = y {
y := {x | p[x]} - {x | p[x] == 0}
}
ããã€ãæ¹æ³ãèããããŸãããå·®éåãäœ¿ãæ¹æ³ã1ã€æããããŸããæ¡ä»¶ã«äžèŽããèŠçŽ ã®éåãäœãããã¹ãŠã®èŠçŽ ãå«ãå¥ã®éåãšã®å·®åãèšç®ãããããè¿ãå€ãšããŠæž¡ããŸããæ¡ä»¶ã«åãéåã¯å
å
è¡šèš {èŠçŽ | æ¡ä»¶}
ã«ãã£ãŠäœãåºãããšãã§ããŸãã
äžèšã®äŸã¯ result
ã«çŽæ¥å€ãæž¡ããããå代å
¥ã§ããªããªã£ãŠããŸããŸããããã»ãã®ã«ãŒã«ã§ã result
ã«èŠçŽ ã远å ããããšããå Žåã¯ã以äžã®ãããªæžãæ¹ãã§ããŸãã
result[z] {
y := {x | p[x]} - {x | p[x] == 0}
z := y[_]
}
result[m] {
m := "hoge" # ãšããããšãããŠããšã©ãŒã«ãªããªã
}
ãã¹ãŠã®èŠçŽ ãäžèŽããªãããšã確èªããã
ãšã©ãŒã«ãªãäŸ
p := {
"blue": 1,
"red": 0,
"yellow": 2,
}
result {
not p[x] == 3
}
ãªããžã§ã¯ãåã®p
ã®äžã«å€ãšããŠ3
ãå
¥ã£ãŠããªãããšã確èªãããããšããæå³ã§èšè¿°ãããã«ãŒã«ã§ãããã¡ããå
ã»ã©ãšåæ§ã§ãnot
ã®äžã§ã®ã¿ x
[2] ãåŒã³åºããŠãããããunsafeãªå€æ°ãšããŠæ±ãããŠããŸãã
è§£æ±ºæ¹æ³1
result {
count({x | p[x] == 3}) == 0
}
ãã¡ããããã€ãæ¹æ³ãèããããŸããã1ã€ç®ã¯ãäžèŽããèŠçŽ ã0ã§ããããšã確èªããããšããã¢ãããŒãã§ããå
çšã®äŸãšåæ§ã«å
å
衚èšã§ãå€ã3
ã§ããããŒã®éåããäœæããçµã¿èŸŒã¿é¢æ° count
ã§éåã®èŠçŽ æ°ã調ã¹ãŸããèŠçŽ æ°ã 0
ãªããå€ã3
ã§ããããŒãã¯ååšããªãããšãããããŸãã
è§£æ±ºæ¹æ³2
result {
not has3
}
has3 {
p[x] == 3
}
å¥ã®è§£æ³ãšããŠãäžåºŠ not
ãå«ãŸãªãåŒã§x
ã®å€ã決å®ãããããããšã«not
ãå«ãåŒã䜿ãããšããæ¹æ³ããããŸããããšã®safetyã®å®çŸ©ã®éãnot
ãå«ãŸãªãåŒã§åŒã³åºãã°safeæ±ãã«ãªãã®ã§ããšã©ãŒã«ã¯ãªããŸããã
çµã¿èŸŒã¿èŠçŽ ïŒUnificationã§å€æ°ã®å€ã決ããããšãã
ãšã©ãŒã«ãªãäŸ
result[y] {
12 = y + 7
}
Regoã«ã¯Unificationãšããæ©èœããããæªå®çŸ©ã®å€æ°ãå«ã =
ã䜿ããšå·ŠèŸºãšå³èŸºãçãããªãæ¡ä»¶ãæºããå€ã代å
¥ãããŸããäŸãã° [1, 2, x] = [y, 2, 3]
ãšãããšãx
ã«ã¯ 3
ããy
ã«ã¯ 1
ãå²ãåœãŠãããŸããäžèšã®åŒãæ°åŠçã«ã¯5ã«ãªãããšã¯èªæãªã®ã§ãããOPAã®åŠçã§ã¯ãæªå®çŸ©ã®å€æ° y
ãçµã¿èŸŒã¿æ©èœã®+
ã䜿ã£ãŠ7
ãšè¶³ãããšããŠããããšè§£éãããy
ãunsafeæ±ãã«ãªã£ãŠããŸããŸãã
è§£æ±ºæ¹æ³
result[y] {
5 = y
}
æ®éã«åŒãã¡ãããšæŽçããã°OKã§ãã
ãŸãšã
æåã¯æ··ä¹±ããã¡ãªunsafeãšã©ãŒã§ãããåºæ¬çã«ã¯ãnot
ããŒã¯ãŒããå«ãåŒä»¥å€ã§å€æ°ãå®çŸ©ããäžã§äœ¿ãããšããããšã§åé¿ã§ããããšãã»ãšãã©ã§ãããšã©ãŒã«ééããéã¯ãŸããã®èгç¹ã§ãã§ãã¯ããŠã¿ãããšããå§ãããŸãã
-
ããªã·ãŒã ãã§å®çµããå Žåã¯
not
ã䜿ã£ãŠãå€ãåæããå¯èœæ§ã¯ããã®ã§ãããããã§ãå€éšããwith
ããŒã¯ãŒããªã©ã§ããŒã¿ãinjectããããšãå¯èœãªããããã¹ãããnot
ã ãã§ã®å€æ°å®çŸ©ãçŠæ¢ããŠãããšæãããŸãã â©ïž -
説æã®æµãäž
x
ã眮ããŠããŸãããæ¬æ¥ãã®ããã«ä»ã«åœ±é¿ããªãã€ãã¬ãŒã·ã§ã³ããããå Žåã¯_
ã«ããã»ããæç€ºçã§ãããã ãã_
ã§ãåæ§ã«unsafeãšã©ãŒã«ãªããŸãã â©ïž