ååã® èšäºã§ãã€ããªããèšèªã¢ããªã³ã°ã³ã³ããŒãã³ãã«ã€ããŠã®è©±ãå§ããŸãããããã¯äžé£ã®æŠå¿µã§ãããè«ççãªé¢ä¿ã«ãã£ãŠæ¥ç¶ããããªããžã§ã¯ãã§ããç§ã¯ãæŠå¿µãç¶æ¿ãããã³ãããã®éã®é¢ä¿ãå®çŸ©ããäž»ãªæ¹æ³ã«ã€ããŠè©±ãããšãã§ããŸããããã€ããªããèšèªã®èšèšãéå§ãããã£ãããšãªã£ãçç±ãšãã®æ©èœã¯ããã®ãããã¯ã«é¢ãã以åã®åºçç©ã«èšèŒãããŠããŸããããããžã®ãªã³ã¯ã¯ããã®èšäºã®æåŸã«ãããŸãã
ãããŠä»ãç§ã¯ããžãã¯ããã°ã©ãã³ã°ã®ãã¥ã¢ã³ã¹ã®ããã€ãã«çªå ¥ããããšãææ¡ããŸããã¢ããªã³ã°ã³ã³ããŒãã³ãã®èšèªã¯å®£èšçãªè«ç圢åŒã§ãããããåŠå®æŒç®åã®ã»ãã³ãã£ã¯ã¹ã®å®çŸ©ã髿¬¡ããžãã¯ã®èŠçŽ ã®å°å ¥ãè«ç倿°ãæäœããæ©èœã®è¿œå ãªã©ã®åé¡ã解決ããå¿ èŠããããŸãããããè¡ãã«ã¯ãäžçã®éæŸæ§/ééæ§ã®ä»®å®ãæåŠãšããŠã®åŠå®ãå®å®ããã¢ãã«ã®ã»ãã³ãã£ã¯ã¹ãååã«æ ¹æ ã®ããã»ãã³ãã£ã¯ã¹ãªã©ã®çè«çãªåé¡ã«å¯ŸåŠããå¿ èŠããããŸãããŸãã髿¬¡ããžãã¯ã®å¯èœæ§ãä»ã®è«çããã°ã©ãã³ã°èšèªã§ã©ã®ããã«å®è£ ãããŠãããã瀺ããŸãã
ããŒã«å€æ°ããå§ããŸããã
ã»ãšãã©ã®ããžãã¯ããã°ã©ãã³ã°èšèªã§ã¯ã倿°ã¯ä»»æã®ã¹ããŒãã¡ã³ãã®èšå·æå®ïŒãã¬ãŒã¹ãã«ããŒïŒãšããŠäœ¿çšãããŸãããããã¯è¿°èªã®åŒæ°ã®äœçœ®ã§çºçããè¿°èªãçžäºã«æ¥ç¶ããŸããããšãã°ãããããŒã°èšèªã®æ¬¡ã®ã«ãŒã«ã§ã¯ã倿°ã¯ãªããžã§ã¯ãXãš Yã®åœ¹å²ãæããã é¢ä¿ã«ãã£ãŠçžäºæ¥ç¶ãããŸãïŒ å åŒã 芪ã ç·æ§ãäžå¹³çïŒ
brothers(X,Y) :- parent(Z,X), parent(Z,Y), male(X), male(Y), X\=Y.
ã¢ããªã³ã°ã³ã³ããŒãã³ãã§ã¯ãçšèªåŒæ°ã®åœ¹å²ã¯äž»ã«æŠå¿µå±æ§ã«ãã£ãŠæããããŸãã
concept brothers (person1, person2) FROM parent p1 (child = person1), parent p2 (child = person2), male(person: person1), male(person: person2) WHERE p1.parent = p2.parent AND person1 != person2
SQLã®å Žåãšåæ§ã«ãååã§çŽæ¥ã¢ã¯ã»ã¹ã§ããŸããææ¡ãããæ§æã¯Prologã«æ¯ã¹ãŠæ±ãã«ããããã«èŠããŸããã屿§ã®æ°ãå€ãå Žåããã®ãªãã·ã§ã³ã¯ãªããžã§ã¯ãã®æ§é ã匷調ããããããã䟿å©ã«ãªããŸãã
ãã ããå Žåã«ãã£ãŠã¯ãã©ã®æŠå¿µã®å±æ§ã«ãå«ãŸãããåæã«é¢ä¿ã®åŒã§äœ¿çšãããããŒã«å€æ°ã宣èšãããšäŸ¿å©ãªå ŽåããããŸããããšãã°ãéšååŒãè€éãªåœ¢åŒã§ããå ŽåãããããããŒã«å€æ°ã«ãªã³ã¯ããããšã«ãããéšååŒããã®æ§æèŠçŽ ã«åè§£ã§ããŸãããŸããéšååŒãè€æ°å䜿çšãããŠããå Žåã¯ã倿°ã«é¢é£ä»ããããšã§1åã ã宣èšã§ããŸãããããŠå°æ¥çã«ã¯ãåŒã®ä»£ããã«å€æ°ã䜿çšããŠãã ãããããŒã«å€æ°ãæŠå¿µå±æ§ããã³èšç®ã³ã³ããŒãã³ã倿°ãšåºå¥ããããã«ãããŒã«å€æ°åã¯$èšå·ã§å§ãŸãå¿ èŠããããšå€æããŸããã ã
äŸãšããŠãå€éšååŸãšå éšååŸã§è¡šããããªã³ã°ãžã®ãã€ã³ãã®åž°å±ãæå®ããæŠå¿µãåæã§ããŸãããã€ã³ããããªã³ã°ã®äžå¿ãŸã§ã®è·é¢ã¯ãäžåºŠèšç®ãã倿°ã«ãªã³ã¯ããŠãååŸãšæ¯èŒããããšãã§ããŸãã
relation pointInRing between point p, ring r where $dist <= r.rOuter and $dist >= r.rInner and $dist = Math.sqrt((p.x â r.x) * (p.x â r.x) + (p.y â r.y) * (p.y â r.y))
åæã«ããã®è·é¢èªäœã«ã¯è£å©çãªåœ¹å²ããããæŠå¿µã®äžéšã«ã¯ãªããŸããã
åŠå®ã
次ã«ãããè€éãªåé¡ãã€ãŸãã¢ããªã³ã°ã³ã³ããŒãã³ãå ã§ã®åŠå®æŒç®åã®å®è£ ãèŠãŠã¿ãŸããããè«çããã°ã©ãã³ã°ã·ã¹ãã ã«ã¯ãéåžžãããŒã«åŠå®ã®æŒç®åã«å ããŠãæåŠãšããŠã®åŠå®ã®ã«ãŒã«ãå«ãŸããŠããŸããããã«ãããpã®å°åºã«å€±æããå Žåã«ã pã§ã¯ãªãå°å·ããããšãã§ããŸã ãç¥è衚çŸã®ç°ãªãã·ã¹ãã ã§ã¯ãåŠå®ã®æšè«ã®èŠåã®æå³ãšã¢ã«ãŽãªãºã ã®äž¡æ¹ãç°ãªãå ŽåããããŸãã ãŸããç¥èã·ã¹ãã ã®å®å šæ§ãšãã芳ç¹ããããã®æ§è³ªã®åé¡ã«çããå¿ èŠããããŸããããªãŒãã³ã¯ãŒã«ãã®ä»®å®ãã«æºæ ããã·ã¹ãã ã§ã¯ ããã¬ããžããŒã¹ã¯äžå®å šã§ãããšèŠãªãããããããã¬ããžããŒã¹ããæ¬ èœããŠããã¹ããŒãã¡ã³ãã¯äžæãšèŠãªãããŸããpã¢ãµãŒã·ã§ã³ã§ ã¯ãããŸãã
ãã¬ããžããŒã¹ãpãšããã¹ããŒãã¡ã³ããæç€ºçã«æ ŒçŽããŠããå Žåã«ã®ã¿åºåã§ããŸã falseããã®ãããªåŠå®ã¯åŒ·ããšåŒã°ããŸããæ¬ èœããŠããã¹ããŒãã¡ã³ãã¯ã誀ãã§ã¯ãªãäžæãšèŠãªãããŸãããã®ãããªä»®å®ã䜿çšããç¥èã·ã¹ãã ã®äŸã¯ãSemanticWEBã§ããããã¯ãWorld WideWebã«åºã¥ããŠåœ¢æãããå ¬çã«ã¢ã¯ã»ã¹å¯èœãªã°ããŒãã«ã»ãã³ãã£ãã¯ãããã¯ãŒã¯ã§ãããã®äžã®æ å ±ã¯ãå®çŸ©äžãäžå®å šã§ããå®å šã«ããžã¿ã«åãããŠæ©æ¢°å¯èªåœ¢åŒã«å€æãããããã§ã¯ãªããããŸããŸãªããŒãã«åæ£ãããåžžã«è£è¶³ãããŠããŸããããšãã°ããŠã£ãããã£ã¢ã§ãã¯ãŒã«ãã¯ã€ããŠã§ãã®äœæè ã§ã»ãã³ãã£ãã¯ãŠã§ãã®æŠå¿µã®äœæè ã§ãããã£ã ããŒããŒãºãªãŒã«é¢ããèšäºã§ãåœŒã®æçã®å¥œã¿ã«ã€ããŠäœãè¿°ã¹ãããŠããªãå Žåãããã¯åœŒãããããæã£ãŠããªãããšãæå³ããã®ã§ã¯ãªããèšäºã¯åã«äžå®å šã§ãã
å察ã®ä»®å®ã¯ ãäžçãéããŠãããšããä»®å®ãã§ãã..ããã®ãããªã·ã¹ãã ã§ã¯ãç¥èããŒã¹ã¯å®å šã§ããããã®äžã«æ¬ èœããŠããã¹ããŒãã¡ã³ãã¯ååšããªããããŸãã¯èª€ãã§ãããšèŠãªããããšèããããŠããŸããã»ãšãã©ã®ããŒã¿ããŒã¹ã¯ãã®ä»®å®ã«åŸããŸããããŒã¿ããŒã¹ã«ãã©ã³ã¶ã¯ã·ã§ã³ãŸãã¯ãŠãŒã¶ãŒã«é¢ããã¬ã³ãŒãããªãå Žåããã®ãããªãã©ã³ã¶ã¯ã·ã§ã³ã¯ååšããããŠãŒã¶ãŒã¯ã·ã¹ãã ã«ç»é²ãããŠããŸããïŒå°ãªããšããã·ã¹ãã ã®ããžãã¯å šäœã¯ãããããååšããªããšããäºå®ã«åºã¥ããŠããŸãïŒã
å®å šãªç¥èããŒã¹ã«ã¯å©ç¹ããããŸãããŸããäžæãªæ å ±ããšã³ã³ãŒãããå¿ èŠã¯ãããŸããã3ã€ã®å€ïŒtrueãfalseãunknownïŒã§ã¯ãªãã2ã€ã®å€ã®ããžãã¯ïŒtrueãfalseïŒã§ååã§ãã第äºã«ãããŒã«åŠå®æŒç®åãšç¥èããŒã¹ããã®ã¹ããŒãã¡ã³ãã®å°åºå¯èœæ§ã®ãã§ãã¯ãçµã¿åãããŠãæåŠãšããŠ1ã€ã®åŠå®æŒç®å ã«ããããšãã§ããŸããïŒå€±æãšããŠã®åŠå®ïŒãã¹ããŒãã¡ã³ããfalseã§ãããšããã¹ããŒãã¡ã³ããæ ŒçŽãããŠããå Žåã ãã§ãªãããã¬ããžããŒã¹ã«ããã«é¢ããæ å ±ããŸã£ãããªãå Žåãtrueãè¿ããŸããããšãã°ã
ã«ãŒã«
p <â not q
ã¯qãfalseã§ããïŒtrueã§ãããšããã¹ããŒãã¡ã³ãããªãããïŒã pãtrueã§ãããšæšæž¬ã ãŸãã
æ®å¿µãªãããæåŠãšããŠã®æåŠã®ã»ãã³ãã£ã¯ã¹ã¯ãèŠãç®ã»ã©æçœã§ã¯ãªããè€éã§ããããŸãããããŸããŸãªè«çããã°ã©ãã³ã°ã·ã¹ãã ã§ã¯ããã®æå³ã«ã¯ç¬èªã®ç¹æ§ããããŸããããšãã°ã埪ç°å®çŸ©ã®å ŽåïŒ
p â not q q â not p
Prologèšèªã§äœ¿çšãããåŸæ¥ã® SLDNF解決ïŒSLD +倱æãšããŠã®åŠå®ïŒã¯å€±æããŸããã¹ããŒãã¡ã³ã pã®åºåã«ã¯qã®åºåãå¿ èŠ ã§ããã q - pã§ã¯ãåºåããã·ãŒãžã£ã¯ç¡éã«ãŒãã«é¥ããŸãã Prologã§ã¯ããã®ãããªå®çŸ©ã¯ç¡å¹ãšèŠãªãããç¥èããŒã¹ã¯äžè²«æ§ããªããšèŠãªãããŸãã
åæã«ããããã®ã¹ããŒãã¡ã³ãã¯ç§ãã¡ã«ãšã£ãŠåé¡ã§ã¯ãããŸãããçŽæçã«ã¯ãããã2ã€ã®ã«ãŒã«ã¯ã pãš qåå¯Ÿã®æå³ãæã¡ãäžæ¹ãçã®å Žåãããäžæ¹ã¯åœã§ãããããã£ãŠãæåŠãšããŠã®åŠå®ã®ãªãã¬ãŒã¿ãŒããã®ãããªèŠåãæ±ãããšãã§ããè«çããã°ã©ã ã®æ§ç¯ã人ã«ãšã£ãŠããèªç¶ã§çè§£ãããããã®ã§ããããšãæãŸããã
ããã«ãç¥èããŒã¹ã®äžè²«æ§ãåžžã«éæã§ãããšã¯éããŸãããããšãã°ãã«ãŒã«å®çŸ©ããã¡ã¯ãããæå³çã«åé¢ããŠãåãã«ãŒã«ã»ãããç°ãªããã¡ã¯ãã»ããã«é©çšã§ããããã«ããå ŽåããããŸãããã®å Žåãã«ãŒã«ããã¹ãŠã®å¯èœãªäºå®ã®ã»ããã«åæãããšããä¿èšŒã¯ãããŸããããŸããããšãã°ãç°ãªãå°éå®¶ã«ãã£ãŠäœæãããå Žåãªã©ãã«ãŒã«èªäœã«äžè²«æ§ããªãããšã蚱容ãããå ŽåããããŸãã
æãããç¥ãããŠãããã£ã³ããŒã³ã§ã¯ãåšæçãªå®çŸ©ã®äžã§è«ççãªçµè«ã圢åŒåããããšãã§ããããã°ã©ã ã®äžæŽå㯠ãæç¶å¯èœãªã»ãã³ãã£ã¯ã¹ãïŒå®å®ããã¢ãã«ã»ãã³ãã£ã¯ã¹ïŒãš ãåççãªã»ãã³ãã£ã¯ã¹ãïŒååã«æ ¹æ ã®ããã»ãã³ãã£ã¯ã¹ïŒã§ãã æ°žç¶çãªã¢ãã«ã»ãã³ãã£ã¯ã¹
ã䜿çšããæšè«ã«ãŒã« ã¯ãããã°ã©ã å ã®äžéšã®åŠå®æŒç®åãããã°ã©ã ã®ä»ã®éšåãšäžèŽããªãå Žåãããããç¡èŠã§ãããšããä»®å®ã«åºã¥ããŠããŸããã«ãŒã«ã®åæã»ããã®ãã®ãããªäžè²«ãããµãã»ãããããã€ãååšããå¯èœæ§ããããããããããããã€ãã®è§£æ±ºçãååšããå¯èœæ§ããããŸããããšãã°ãäžèšã®å®çŸ©ã§ã¯ãæšè«ã¯æåã®ã«ãŒã«ããéå§ã§ããŸãïŒ pâqã§ã¯ãªãïŒã2çªç®ïŒqâpã§ã¯ãªãïŒãç Žæ£ã ãè§£{pãqã§ã¯ãªã}ãååŸããŸã ãæ¬¡ã«ã2çªç®ã«ã€ããŠãåãããšãè¡ãã{pã§ã¯ãªãq}ãååŸã ãŸããå šäœçãªãœãªã¥ãŒã·ã§ã³ã¯ã代æ¿ãœãªã¥ãŒã·ã§ã³ã®çµã¿åããã»ããã«ãªããŸããããšãã°ãã«ãŒã«ããïŒ
person(alex) alive(X) âperson(X) male(X) âperson(X) AND NOT female(X) female(X) âperson(X) AND NOT male(X)
{personïŒalexïŒãaliveïŒalexïŒãmaleïŒalexïŒ}ãš {personïŒalexïŒãaliveïŒalexïŒãfemaleïŒalexïŒ}ã®2ã€ã®åçãªãã·ã§ã³ã衚瀺ã§ããŸã ã
åççãªã»ãã³ãã£ã¯ã¹ã¯åãä»®å®ããå§ãŸããŸãããã«ãŒã«ã®ãã¹ãŠã®ä»£æ¿åæãµãã»ãããæºãã1ã€ã®äžè¬çãªéšåçãªè§£æ±ºçãèŠã€ããããšããŸããéšåçãªè§£æ±ºçãšã¯ããtrueããŸãã¯ãfalseãã®å€ãäºå®ã®äžéšã«ã€ããŠã®ã¿è¡šç€ºãããæ®ãã®å€ã¯äžæã®ãŸãŸã«ãªãããšãæå³ããŸãããããã£ãŠãããã°ã©ã å ã®ãã¡ã¯ãã®èª¬æã§ã¯ã2å€ã®ããžãã¯ã䜿çšãããæšè«ã®ããã»ã¹ã§ã¯ã3å€ã®ããžãã¯ã䜿çšãããŸããäžèšã®ã«ãŒã«ã®å Žåãpãš qã®äž¡æ¹ã®æå³ äžæã«ãªããŸããããããäŸãã°ã
p â not q q ânot p r â s s
pãš qã¯äžæã®ãŸãŸã§ãããrãšsãçã§ãã ãš èªä¿¡ãæã£ãŠæšæž¬ã§ã ãŸãã ããšãã°ãalexã®äŸããã{personïŒalexïŒãaliveïŒalexïŒ}ãæšæž¬ã§ããŸãã ãmaleïŒalexïŒãš female {alex}ã®ã¹ããŒãã¡ã³ã ã¯äžæã®ãŸãŸã§ãã ã§ã¯ SQLãããŒã«åŠå®ïŒ NOTïŒãšDerivabilityãã§ãã¯ãïŒ NOT EXISTS
ïŒã¯åé¢ãããŠããŸãããããã®æŒç®åã¯ãããŸããŸãªã¿ã€ãã®åŒæ°ã«é©çšãããŸããNOTã¯ããŒã«å€ãå転ãã EXISTS / NOT EXISTSã¯ãã¹ããããã¯ãšãªã®çµæã®ç©ºããã§ãã¯ãããããããããçµã¿åãããŠãæå³ããããŸããã SQLã®åŠå®æŒç®åã®ã»ãã³ãã£ã¯ã¹ã¯éåžžã«åçŽã§ãããååž°çãŸãã¯è€éãªäžè²«æ§ã®ãªãã¯ãšãªã§æ©èœããããã«ã¯èšèšãããŠããŸãããç¹å¥ãªSQLã¹ãã«ã䜿çšãããšãã¯ãšãªãç¡éã®ååž°ã«éä¿¡ã§ããŸãããã ããè€éãªè«çæ§é ã¯æããã«åŸæ¥ã®SQLã¢ããªã±ãŒã·ã§ã³ã®ç¯å²å€ã§ãããããé«åºŠãªåŠå®æŒç®åã»ãã³ãã£ã¯ã¹ã¯å¿ èŠãããŸããã
次ã«ãèšèšããããã€ããªããèšèªã®ã¢ããªã³ã°ã³ã³ããŒãã³ãã®åŠå®æŒç®åã®ã»ãã³ãã£ã¯ã¹ãçè§£ããŠã¿ãŸããã ã
ãŸããã¢ããªã³ã°ã³ã³ããŒãã³ãã¯ãç°ãªãããŒã¿ãœãŒã¹ãçµ±åããããã«èšèšãããŠããŸãããããã¯éåžžã«å€æ§ã§ãããå®å šãŸãã¯äžå®å šã®ããããã§ããå¯èœæ§ããããŸãããããã£ãŠãå°åºå¯èœæ§ãã§ãã¯æŒç®åã¯çµ¶å¯Ÿã«å¿ èŠã§ãã
次ã«ãã¢ããªã³ã°ã³ã³ããŒãã³ãã®æŠå¿µã®åœ¢åŒã¯ãããžãã¯ããã°ã©ãã³ã°ã«ãŒã«ãããSQLã¯ãšãªã«ã¯ããã«è¿ããã®ã§ããæŠå¿µãè€éãªæ§é ã§ãããããããŒã«åŠå®ã®1ã€ã®æŒç®åãæ··åããŠãæŠå¿µã®å°åºå¯èœæ§ã確èªããããšã¯æå³ããããŸãããããŒã«å€ã®åŠå®ã¯ã屿§ã倿°ãããã³åŒã®çµæã«ã®ã¿é©çšããæå³ããããŸãããããã¯falseãŸãã¯trueã®ããããã«ãªããŸãããããæŠå¿µã«é©çšããããšã¯ããå°é£ã§ãããããã¯ç°ãªã屿§ã§æ§æãããŠããå¯èœæ§ãããããããã®ã©ããæŠå¿µå šäœã®èåœãŸãã¯çå®ã®åå ã§ããããæç¢ºã§ã¯ãããŸãããæŠå¿µã¯ãåã ã®å±æ§ã§ã¯ãªããå šäœãšããŠã®åæããŒã¿ããå°ãåºãããšãã§ããŸããããŒãã«ã®æ§é ãåºå®ãããŠããSQLãšã¯ç°ãªããæŠå¿µã®æ§é ã¯æè»ã§ããå¯èœæ§ããããæŠå¿µã®æ§æã«å¿ èŠãªå±æ§ããŸã£ãããªãå ŽåããããŸãããããã£ãŠã屿§ã®ååšã確èªããå¿ èŠããããŸãã
ãããã£ãŠãäžèšã®åŠå®ã®ã¿ã€ãããšã«åå¥ã®æŒç®åãå°å ¥ããããšã¯çã«ããªã£ãŠããŸãã屿§ã®åœãã¯ãåŸæ¥ã®ããŒã«NOTæŒç®åã䜿çšããŠãã§ãã¯ã§ã ãæŠå¿µã«çµã¿èŸŒã¿ã®DEFINED颿°ã䜿çšããŠå±æ§ãå«ãŸããŠãããã©ãã ãããã³EXISTS颿°ã䜿çšããŠå ã®ããŒã¿ããæŠå¿µãæšæž¬ããçµæã確èªã§ããŸã ã 3ã€ã®å¥ã ã®æŒç®åã¯ãè€éãªé害ãšããŠã®åŠå®æŒç®åãããäºæž¬å¯èœã§ãçè§£ããããã䜿ããããã§ããå¿ èŠã«å¿ããŠãç¹å®ã®ã±ãŒã¹ããšã«æå³ã®ããæ¹æ³ã§1ã€ã®æŒç®åã«çµã¿åãããããšãã§ããŸãã
第äžã«ãçŸæç¹ã§ã¯ãã¢ããªã³ã°ã³ã³ããŒãã³ãã¯ãå°ããªã¢ããªã±ãŒã·ã§ã³ã¬ãã«ã®ãªã³ãããžãŒãäœæããããã®ããŒã«ãšèŠãªãããŠããŸãããã®èšèªã¯ãããã°ã©ã ã®ååž°çãªå®çŸ©ãšè«ççãªççŸã«å¯ŸåŠã§ããç¹å¥ãªè«çç衚çŸåãšæŽç·Žãããæšè«èŠåãå¿ èŠãšããªãå¯èœæ§ããããŸãããããã£ãŠãæ°žç¶ã¢ãã«ã®ã»ãã³ãã£ã¯ã¹ãŸãã¯æ ¹æ ã®ããã»ãã³ãã£ã¯ã¹ã«åºã¥ãè€éãªæšè«ã«ãŒã«ã®å®è£ ã¯ãå°ãªããšããã®æ®µéã§ã¯é©åã§ã¯ãªãããã§ããåŸæ¥ã®SLDNFè§£å床ã§ååã§ãã
ããã§ã¯ãããã€ãã®äŸãèŠãŠã¿ãŸãããã
æŠå¿µã®ç¹å®ã®å±æ§ãããã瀺ãæå³ãæã£ãŠããå Žåããã®æŠå¿µã«åŠå®çãªæå³ãäžããããšãã§ããŸãã屿§ãåŠå®ãããšããã®ãããªãšã³ãã£ãã£ãæç€ºçã«èŠã€ããããšãã§ããŸãã
concept unfinishedTask is task t where not t.completed
æŠå¿µã®ãšã³ãã£ãã£ãç°ãªãæ§é ãæã€ããšãã§ããå Žåã屿§ã®ãããŸããããã§ãã¯ããæ©èœã¯äŸ¿å©ã§ãã
concept unassignedTask is task t where not defined(t.assignedTo) or empty(t.assignedTo)
æŠå¿µã®æšè«å¯èœæ§ããã§ãã¯ããæ©èœã¯ãååž°çãªå®çŸ©ãšéå±€æ§é ãæäœãããšãã«ããããã®ãªããã®ã§ãã
concept minimalElement is element greater where not exists(element lesser where greater.value > lesser.value)
ãã®äŸã§ã¯ãå°ããã¢ã€ãã ã®ååšã®ãã§ãã¯ããµãã¯ãšãªãšããŠå®è¡ãããŸããæ¬¡ã®åºçç©ã§ã¯ããã¹ããããã¯ãšãªã®äœæã«ã€ããŠè©³ããæ€èšããäºå®ã§ãã
髿¬¡ããžãã¯ã®èŠçŽ
ã§ äžæ¬¡ããžãã¯ã倿°ã¯ããªããžã§ã¯ãã®ã»ãããäžèŽãããããšãã§ããå¯äžã®è¿°èªã®åŒæ°ã®äœçœ®ã«çŸããŸãã 髿¬¡ããžãã¯ã圌ãã¯ãŸããé¢ä¿ã®ã»ããã«å¯Ÿå¿ããããšãã§ãããšè¿°èªåã®äœçœ®ã«çŸããŸããèšãæãããšã1次ããžãã¯ã䜿çšãããšããã¹ãŠãŸãã¯äžéšã®ãªããžã§ã¯ãã«å¯ŸããŠäœããã®é¢ä¿ãçã§ãããšäž»åŒµã§ããŸãããããŠããã髿¬¡ã®è«çã¯ãé¢ä¿éã®é¢ä¿ãèšè¿°ããããšã§ãã
ããšãã°ãå åŒãå§åйãåäŸãŸãã¯èŠªãåç¶ãŸãã¯åæ¯ãªã©ã§ãããšè¿°ã¹ãããšãã§ããŸãã
Brother(John, Joe). Son(John, Fred). Uncle(John, Alex).
ãã ããé¢ä¿ã¢ãµãŒã·ã§ã³ãäœæããã«ã¯ã1次ããžãã¯ã§ãäžèšã®ãã¹ãŠã®ã¹ããŒãã¡ã³ãããªã¹ãããORæŒç®ã䜿çšããŠããããçµã¿åãããå¿ èŠããããŸãã
ⱯX,ⱯY(Brother(X, Y) OR Brother(Y, X) OR Son(X, Y) OR Son(Y, X) OR Uncle(X, Y) OR Uncle(Y, X) â Relative(X, Y)).
2次ããžãã¯ã䜿çšãããšãä»ã®ã¹ããŒãã¡ã³ãã«ã€ããŠã¹ããŒãã¡ã³ããäœæã§ããŸããããšãã°ãå åŒãå§åйã芪ãšåãåç¶ãšç¥ã®éã®é¢ä¿ã¯èŠªæé¢ä¿ã§ãããšçŽæ¥è¿°ã¹ãããšãã§ããŸãã
RelativeRel(Brother). RelativeRel(Son). RelativeRel(Uncle). ⱯX,ⱯY(â±»R(RelativeRel(R) AND (R(X, Y) OR R(Y, X))) â Relative(X, Y)).
Xãš Yããšã«ãRelativeRelã®èŠªæéã®é¢ä¿ã§ããé¢ä¿ Rããã ã Xãš Yããã®é¢ä¿ãæºããå Žåã Xãš Yã¯èŠªæã§ãããšäž»åŒµã ãŸããé¢ä¿åŒæ°ã¯ä»ã®é¢ä¿ã«ããããšãã§ãã倿°ã¯é¢ä¿åã®ä»£ããã«äœ¿çšã§ããŸãã äžæ¬¡ã®ããžãã¯ã¯ããªããã¹ããŒãã¡ã³ãã«é¢ããã¹ããŒãã¡ã³ãã«ã€ããŠã®ã¹ããŒãã¡ã³ããæ§ç¯ããããšãå¯èœã«ããããšããããã«ã é«éè¿°èªè«ç
-ãã¹ãã¬ãã«ã®ã¹ããŒãã¡ã³ãã«ã€ããŠã髿¬¡ã®ããžãã¯ã¯ã¯ããã«è¡šçŸåããããŸãããã¯ããã«è€éã§ããå®éã«ã¯ãè«çããã°ã©ãã³ã°ã·ã¹ãã ã¯ããã®èŠçŽ ã®äžéšã®ã¿ããµããŒãããŸãããããã®èŠçŽ ã¯ãäž»ã«ãè¿°èªã®äœçœ®ã§ã®å€æ°ãšä»»æã®åŒã®äœ¿çšã«å¶éãããŠããŸãã
ã§ ããããŒã°ããã®ãããªããžãã¯ã®èŠçŽ ãä»ã®è¿°èªã§ããã®åŒæ°ããå èµã¡ã¿è¿°èªã®ããã€ãã䜿çšããŠå®è£ ãããŠããŸããäž»ãªãã®ã¯è¿°èª åŒã³åºãã§ãããã«ãããçŸåšã®ã«ãŒã«ã®ã¿ãŒã²ãããªã¹ãã«è¿°èªãåçã«è¿œå ã§ããŸããåœŒã®æåã®è°è«ã¯ç®æšãšããŠæ±ãããæ®ãã¯ãã®è°è«ãšããŠæ±ãããŸãã Prologã¯ãæåã®åŒæ°ã«äžèŽããè¿°èªããã¬ããžããŒã¹ã§æ€çŽ¢ããããããçŸåšã®ã¿ãŒã²ãããªã¹ãã«è¿œå ããŸãã芪æã®äŸã¯æ¬¡ã®ããã«ãªããŸãã
brother(john, jack). sister(mary, john). relative_rel(brother). relative_rel(sister). relative(X, Y) :- relative_rel(R), (call(R, X, Y); call(R, Y, X)).
Prologã¯ãè¿°èªfindallïŒTemplateãGoalãBagïŒã bagofïŒTemplateãGoalãBagïŒã setofïŒTemplateãGoalãSetïŒãªã©ããµããŒãã ãŸããããã«ããããã³ãã¬ãŒããã³ãã¬ãŒãã«äžèŽãã ãã¹ãŠã®ç®æšç®æšãœãªã¥ãŒã·ã§ã³ãæ€çŽ¢ã ãçµ±åã§ããŸãïŒãªã³ã¯ïŒçµæã®ããã°ïŒãŸã㯠ã»ããïŒãå«ããªã¹ã ã Prologã«ã¯ããã¬ããžããŒã¹ã§è¿°èªãæ€çŽ¢ããããã®çµã¿èŸŒã¿ã®è¿°èª current_predicateã clauseãªã©ããããŸãããã¬ããžããŒã¹ã§è¿°èªãšãã®å±æ§ãæäœããããšãã§ããŸã-ãããã远å ãåé€ãã³ããŒããŸãã
HiLogèšèª ã¯ãæ§æã¬ãã«ã§é«æ¬¡ã®ããžãã¯ããµããŒãããŸããç¹å¥ãªã¡ã¿è¿°èªã®ä»£ããã«ãä»»æã®çšèªïŒå€æ°ãªã©ïŒãè¿°èªåã®äœçœ®ã§çŽæ¥äœ¿çšã§ããŸãã芪æã決å®ããããã®ã«ãŒã«ã¯æ¬¡ã®åœ¢åŒãåããŸãã
relative(X, Y) :- relative_rel(R), (R(X, Y); R(Y, X)).
ãã®æ§æã¯ãPrologãšæ¯èŒããŠããã宣èšçã§ãç°¡æœã§ãçè§£ãããããèªç¶ã§ããåæã«ããã¹ãŠã®HiLogæ§ææ§é ã¯ãåŒã³åºãã¡ã¿è¿°èªã䜿çšããŠ1次è«çåŒã«å€æã§ãããããHiLogã¯Prologã®æ§æããªã¢ã³ãã®ãŸãŸ ã§ãã
HiLogã¯é«æ¬¡ã®æ§æãæã£ãŠãããšèŠãªãã ãŸããã äžæ¬¡ã®ã»ãã³ãã£ã¯ã¹ã§ããã€ãŸããã«ãŒã«ãŸãã¯é¢æ°ã衚ã倿°ãæ¯èŒããå Žåãå®è£ ã§ã¯ãªããååã®ã¿ãèæ ®ãããŸããλ-Prologãªã©ã®é«æ¬¡ã®ã»ãã³ãã£ã¯ã¹ããµããŒãããèšèªããããŸã ãããã«ãããã«ãŒã«ãšé¢æ°ã®å®è£ ãæšè«ããã»ã¹ã«å«ããããšãã§ããŸãããããããã®ããžãã¯ãšãã®æšè«ã¢ã«ãŽãªãºã ã¯ã¯ããã«è€éã§ãã
次ã«ãã¢ããªã³ã°ã³ã³ããŒãã³ãã®é«æ¬¡ããžãã¯æ©èœã«ç§»ããŸããã ãã»ãšãã©ã®å®çšçãªã¡ã¿ããã°ã©ãã³ã°ã¿ã¹ã¯ã§ã¯ãPrologãšHiLogã§ååã§ãã HiLogã¯ããèªç¶ãªæ§æãæã£ãŠããã®ã§ããããåºç€ãšããŠãšãããšã¯çã«ããªã£ãŠããŸããæŠå¿µã®ååãšãã®å±æ§ã®äœçœ®ã«ä»»æã®åŒã䜿çšãããããã倿°ã颿°åŒã³åºããããã³ãã®ä»ã®æ§é ãšåºå¥ã§ããããã«ããããã«ãååãåçã«æå®ããããã®ç¹å¥ãªæŒç®åãå°å ¥ã ãŸãã
< >
åŒã®å€ãè©äŸ¡ããã³ã³ããã¹ãã«å¿ããŠãæŠå¿µåããšã€ãªã¢ã¹ããŸãã¯å±æ§åãšããŠäœ¿çšã§ããŸãããã®æŒç®åãFROMã»ã¯ã·ã§ã³ã®æŠå¿µåã®ä»£ããã« ãªãããã®åŒã®å€ãå®çŸ©ãããŠããå Žåãæå®ãããååã®ãã¹ãŠã®æŠå¿µãæ€çŽ¢ããããããã«å¯ŸããŠè«çæ€çŽ¢ãå®è¡ãããŸãã
concept someConcept ( ⊠) from conceptA a, <a.conceptName> b where âŠ
ããšãã°ãåŒã®å€ãå®çŸ©ãããŠããªãå ŽåãåŒã¯å€ã«é¢é£ä»ããããŠããªãããŒã«å€æ°ã§ãã ãæ¬¡ã«ãããã·ãŒãžã£ã¯ãã¹ãŠã®é©åãªæŠå¿µãèŠã€ãã倿°ã®å€ããããã®ååã«é¢é£ä»ããŸã ãFROM
concept someConcept is <$conceptName> where âŠ
ã»ã¯ã·ã§ã³ã®ã³ã³ããã¹ãã§ã¯ãååãæå®ããããã®æŒç®åã¯è«ççãªã»ãã³ãã£ã¯ã¹ãæã£ãŠãã ãšèšã ãŸãã
ãŸãã<>æŒç®å ã䜿çšããŠãã³ã³ã»ãããšã€ãªã¢ã¹ãŸãã¯å±æ§åã®äœçœ®ã«WHEREå¥ãé 眮ããããšãã§ããŸã ã
concept someConcept ( ⊠) from conceptA a, conceptB b where conceptB.<a.foreignKey> = a.value ...
WHEREå¥ã®åŒ ã¯æ±ºå®è«çã§ããã€ãŸããè«çæ€çŽ¢ã䜿çšããŠåŒæ°ã®äžæãªå€ãèŠã€ããããšã¯ãããŸãããã€ãŸããåŒ conceptBã<A.foreignKey> = a.valueã¯ãæŠå¿µaã®ãšã³ãã£ãã£ãæ€åºããããã® foreignKey屿§ãš value屿§ãå€ã«é¢é£ä»ããããåŸã«ã®ã¿è©äŸ¡ãã ãŸãããããã£ãŠãFROMå¥ã®ã³ã³ããã¹ãã§ã¯ãnameã¹ããŒãã¡ã³ãã«ã¯ æ©èœçãªã»ãã³ãã£ã¯ã¹ããããšèšããŸã ã
髿¬¡ããžãã¯ã®ããã€ãã®å¯èœãªã¢ããªã±ãŒã·ã§ã³ãèããŠã¿ãŸãããã
髿¬¡ã®ããžãã¯ã䟿å©ãªæãæçœãªäŸã¯ãç¹å®ã®æ¡ä»¶ãæºãããã¹ãŠã®æŠå¿µã®1ã€ã®ååã®äžã§ã®çµåã§ããããšãã°ãç¹å®ã®å±æ§ãæã€ããããã£ãŠã ãã€ã³ãã®æŠå¿µã¯ã座æšxããã³ yãå«ããã¹ãŠã®æŠå¿µãšèŠãªãããšãã§ããŸã ã
concept point is <$anyConcept> a where defined(a.x) and defined(a.y)
ããŒã«æ€çŽ¢ã¯ã$ anyConcept倿°ãã座æšå±æ§ãæã€ãã¹ãŠã®å®£èšãããæŠå¿µåïŒãã¡ããããèªäœãé€ãïŒã«ãã€ã³ãã ãŸãã
ããè€éãªäŸã¯ãå€ãã®æŠå¿µã«é©çšãããäžè¬çãªé¢ä¿ã宣èšããããšã§ããããšãã°ãæŠå¿µéã®äžæçãªèŠªåé¢ä¿ïŒ
relation ParentRel between <$conceptName> parent, <$conceptName> child where defined(parent.id) and defined(child.parent) and ( parent.id = child.parent or exists( <$conceptName> intermediate where intermediate.parent = parent.id and ParentRel(intermediate, child) ))
倿° $ conceptNameã¯ã芪ãåãäžéã®3ã€ã®æŠå¿µãã¹ãŠã§äœ¿çšãããŸããã€ãŸãããããã®ååã¯åãã§ããå¿ èŠããããŸãã
髿¬¡ããžãã¯ã¯ãç¹å®ã®ååã«çžãããããšãªããæå®ãããæ¡ä»¶ãæºããå€ãã®æŠå¿µã«é©çšã§ããäžè¬çãªæŠå¿µãšé¢ä¿ãäœæã§ãããšããæå³ã§ãäžè¬çãªããã°ã©ãã³ã°ã®å¯èœæ§ãéããŸãã
ãŸããåçãªååã®çœ®æã¯ãããæŠå¿µã®å±æ§ãä»ã®æŠå¿µã®ååãŸãã¯ãã®å±æ§ãžã®åç §ã§ããå ŽåããŸãã¯ãœãŒã¹ããŒã¿ã«äºå®ã ãã§ãªããããã®æ§é ãå«ãŸããŠããå Žåã«äŸ¿å©ã§ããããšãã°ããœãŒã¹ããŒã¿ã«ã¯ãããŒã¿ããŒã¹å ã®XMLããã¥ã¡ã³ããŸãã¯ããŒãã«ã®ã¹ããŒãã®èª¬æãå«ããããšãã§ããŸããå ã®ããŒã¿ã«ã¯ãããŒã¿ã¿ã€ãã圢åŒãŸãã¯ããã©ã«ãå€ãæ€èšŒæ¡ä»¶ããŸãã¯ããã€ãã®ã«ãŒã«ãªã©ããã¡ã¯ãã«é¢ããè¿œå æ å ±ãå«ããããšãã§ããŸãããŸããåæããŒã¿ã¯äœãã®ã¢ãã«ãèšè¿°ã§ããã¢ããªã³ã°ã³ã³ããŒãã³ããã¡ã¿ã¢ãã«ã®æ§ç¯ãæ åœããŸããèªç¶èšèªã®ããã¹ããæ±ãå ŽåããœãŒã¹ããŒã¿ã«ã¯ã¹ããŒãã¡ã³ãã ãã§ãªããã¹ããŒãã¡ã³ãã«é¢ããã¹ããŒãã¡ã³ããå«ãŸããããšãåæãšããŠããŸããããããã¹ãŠã®å Žåã«ãããŠãäžæ¬¡è«çã¯ååã§ã¯ãªãããã衚çŸåè±ããªèšèªãå¿ èŠã§ãã
ç°¡åãªäŸãšããŠãããŒã¿ã«ããã€ãã®ãªããžã§ã¯ããå«ãŸããŠããå Žåãšããããã®ãªããžã§ã¯ãã®å±æ§ãåå¥ã®ãšã³ãã£ãã£ãšããŠæ€èšŒããããã®ã«ãŒã«ã«ã€ããŠèããŠã¿ãŸãã
fact validationRule {objectName: âsomeObjectâ, attributeName: âsomeAttributeâ, rule: function(value) {...}}
æ€èšŒçµæã¯ãæ¬¡ã®æŠå¿µã§èª¬æã§ããŸãã
concept validationRuleCheck ( objectName = r.objectName, attributeName = r.attrName, result = r.rule(o.<r.attrName>) ) from validationRule r, <r.objectName> o where defined(o.<r.attrName>)
髿¬¡ã®ããžãã¯ã¯ãäžè¬åãããã¡ã¿ããã°ã©ãã³ã°ã«éåžžã«è峿·±ãå¯èœæ§ããããããŸãããã®äžè¬çãªèãæ¹ããèããããŸããã§ããããã®é åã¯éåžžã«è€éã§ãããå°æ¥çã«ã¯åŸ¹åºçãªèª¿æ»ãå¿ èŠã§ããèšèªã®äŸ¿å©ãªãã¶ã€ã³ãéžæãããšãã芳ç¹ãšããã®ããã©ãŒãã³ã¹ã®åé¡ã®äž¡æ¹ã®èгç¹ããã
çµè«
ã¢ããªã³ã°ã³ã³ããŒãã³ãã§äœæ¥ããéçšã§ãããŒã«å€æ°ãåŠå®æŒç®åã®ã»ãã³ãã£ã¯ã¹ã髿¬¡ããžãã¯ã®èŠçŽ ã®æäœãªã©ãããžãã¯ããã°ã©ãã³ã°ã®ããªãç¹å®ã®åé¡ã«å¯ŸåŠããå¿ èŠããããŸããããã¹ãŠã倿°ã䜿çšããŠéåžžã«åçŽã§ããããšã倿ããå ŽåãåŠå®æŒç®åãšé«æ¬¡ããžãã¯ã®å®è£ ã«å¯Ÿããåäžã®ç¢ºç«ãããã¢ãããŒãã¯ãªããç¬èªã®ç¹æ§ãé·æãããã³çæãæã€ããã€ãã®ãœãªã¥ãŒã·ã§ã³ããããŸãã
ç§ã¯ãçè§£ãããããå®éã«äŸ¿å©ãªãœãªã¥ãŒã·ã§ã³ãéžæããããšããŸãããç§ã¯ãæåŠãšããŠã¢ããªã·ãã¯åŠå®æŒç®åãããŒã«åŠå®ã®3ã€ã®å¥åã®æŒç®åã«åå²ããæŠå¿µã®æšè«å¯èœæ§ãšãªããžã§ã¯ãå ã®å±æ§ã®ååšã確èªããããšã奜ã¿ãŸãããå¿ èŠã«å¿ããŠãããã3ã€ã®æŒç®åãçµã¿åãããŠãç¹å®ã®ã±ãŒã¹ããšã«å¿ èŠãªåŠå®ã»ãã³ãã£ã¯ã¹ãååŸã§ããŸããæšè«ã®åŠå®ã®ã«ãŒã«ã«ã€ããŠã¯ãæšæºã®SLDNFè§£å床ãåºæ¬ãšããŠæ¡çšããããšã«ããŸãããäžè²«æ§ã®ãªãååž°ã¹ããŒãã¡ã³ããåŠçããããšã¯ã§ããŸããããæ°žç¶ã¢ãã«ã»ãã³ãã£ã¯ã¹ãæšè«ã»ãã³ãã£ã¯ã¹ãªã©ã®ããé«åºŠãªä»£æ¿ææ®µãããçè§£ãšå®è£ ãã¯ããã«ç°¡åã§ãã
äžè¬åããã³ã¡ã¿ããã°ã©ãã³ã°ã«ã¯ããã髿¬¡ã®ããžãã¯ãå¿ èŠã§ããäžè¬çãªããã°ã©ãã³ã°ãšã¯ãåã®ç¹å®ã®ååã«çžãããããšãªããããŸããŸãªåã®æŠå¿µããæ°ããæŠå¿µãæ§ç¯ããæ©èœãæå³ããŸããã¡ã¿ããã°ã©ãã³ã°ãšã¯ãä»ã®æŠå¿µã®å©ããåããŠãããã€ãã®æŠå¿µã®æ§é ãèšè¿°ããèœåãæå³ããŸããã¢ããªã³ã°ã³ã³ããŒãã³ãã®é«æ¬¡ããžãã¯èŠçŽ ã®ã¢ãã«ãšããŠHiLogèšèªãæ¡çšããããšã«ããŸãããæè»ã§äŸ¿å©ãªæ§æããããè¿°èªåã®äœçœ®ã§å€æ°ã䜿çšã§ããã»ããåçŽã§æç¢ºãªã»ãã³ãã£ã¯ã¹ã䜿çšã§ããŸãã
次ã®èšäºã§ã¯ãSQLã®äžçããã®åçšã«å°å¿µããäºå®ã§ãããã¹ããããã¯ãšãªãšéèšã§ãããŸããæšè«ã䜿çšããã代ããã«ããšã³ãã£ãã£ãç¹å®ã®é¢æ°ã䜿çšããŠçŽæ¥çæãããå¥ã®ã¿ã€ãã®æŠå¿µã«ã€ããŠã説æããŸãããŸããããã䜿çšããŠãããŒãã«ãé åãããã³é£æ³é åããªããžã§ã¯ã圢åŒã«å€æããããããè«çæšè«ããã»ã¹ã«å«ããæ¹æ³ïŒé åãããŒãã«åœ¢åŒã«å€æããSQL UNNESTæäœãšåæ§ïŒã
è±èªã®ç§åŠçãªã¹ã¿ã€ã«ã®å šæã¯ ãã¡ãããå ¥æã§ããŸãã
以åã®åºçç©ãžã®ãªã³ã¯ïŒ
ãã«ããã©ãã€ã ããã°ã©ãã³ã°èšèªã®èšèšãããŒã1-ããã¯äœã®ããã§ããïŒ
ãã«ããã©ãã€ã ããã°ã©ãã³ã°èšèªãèšèšããŸããããŒã2-PL / SQLãLINQãGraphQLã§ã®æ§ç¯ã¢ãã«ã®æ¯èŒ
ãã«ããã©ãã€ã ããã°ã©ãã³ã°èšèª ãèšèšããŸããããŒã3-ç¥è衚çŸèšèªã®æŠèŠãã«ããã©ãã€ã ããã°ã©ãã³ã°èšèªã
èšèšããŸããããŒã4-ã¢ããªã³ã°èšèªã®åºæ¬çãªæ§æ