diff --git a/src/cozoscript.pest b/src/cozoscript.pest index 1e615450..d793b355 100644 --- a/src/cozoscript.pest +++ b/src/cozoscript.pest @@ -57,8 +57,8 @@ relation_apply = {relation_ident ~ "[" ~ apply_args ~ "]"} disjunction = {(atom ~ "or" )* ~ atom} atom = _{grouped | triple | negation | relation_apply | rule_apply | unify_multi | unify | expr } -unify = {var ~ ("is" | "<-") ~ expr} -unify_multi = {var ~ ("is_in" | ("<-" ~ "..")) ~ expr} +unify = {var ~ "=" ~ expr} +unify_multi = {var ~ "in" ~ expr} negation = {"not" ~ atom} triple = { "[" ~ expr ~ compound_ident ~ expr ~ "]"} // triple_pull = {compound_ident ~ "[" ~ expr ~ "]"} diff --git a/tests/air_routes.rs b/tests/air_routes.rs index 2e6ffeb0..f72c2cc0 100644 --- a/tests/air_routes.rs +++ b/tests/air_routes.rs @@ -157,8 +157,8 @@ fn air_routes() -> Result<()> { let astar_time = Instant::now(); let res = db.run_script(r#" - starting[code, lat, lon] := code <- 'HFE', :code_lat_lon[code, lat, lon]; - goal[code, lat, lon] := code <- 'LHR', :code_lat_lon[code, lat, lon]; + starting[code, lat, lon] := code = 'HFE', :code_lat_lon[code, lat, lon]; + goal[code, lat, lon] := code = 'LHR', :code_lat_lon[code, lat, lon]; ?[] <~ ShortestPathAStar(:flies_to_code[], :code_lat_lon[node, lat1, lon1], starting[], goal[goal, lat2, lon2], heuristic: haversine_deg_input(lat1, lon1, lat2, lon2) * 3963); "#, ¶ms, )?; @@ -292,7 +292,7 @@ fn air_routes() -> Result<()> { // let simple_query_time = Instant::now(); // let res = db.run_script(r#" - // ?[c, code, desc] := [c country.code 'CU'] or c <- 10000239, [c country.code code], [c country.desc desc]; + // ?[c, code, desc] := [c country.code 'CU'] or c = 10000239, [c country.code code], [c country.desc desc]; // "#, ¶ms, // )?; // dbg!(simple_query_time.elapsed()); @@ -412,7 +412,7 @@ fn air_routes() -> Result<()> { let most_out_routes_time_inv = Instant::now(); let res = db.run_script( r#" - route_count[count(r), a, x] := [r route.src a], x <- 1; + route_count[count(r), a, x] := [r route.src a], x = 1; ?[code, n] := route_count[n, a, _], n > 180, [a airport.iata code]; :sort -n; "#, @@ -533,7 +533,7 @@ fn air_routes() -> Result<()> { airports_by_country[c, count(a)] := [a airport.country c]; country_count[c, max(count)] := airports_by_country[c, count]; ?[code, count] := [c country.code code], country_count[c, count]; - ?[code, count] := [c country.code code], not country_count[c, _], count <- 0; + ?[code, count] := [c country.code code], not country_count[c, _], count = 0; :order count; ", @@ -578,7 +578,7 @@ fn air_routes() -> Result<()> { r#" airports_by_continent[c, count(a)] := [a airport.iata _], [c geo.contains a]; ?[cont, max(count)] := airports_by_continent[c, count], [c continent.code cont]; - ?[cont, max(count)] := [_ continent.code cont], count <- 0; + ?[cont, max(count)] := [_ continent.code cont], count = 0; "#, ¶ms, )?; @@ -632,7 +632,7 @@ fn air_routes() -> Result<()> { [r1 route.src aus], [r1 route.dst a], [r route.src a]; - ?[max(total), collect(coll)] := two_hops[total], out_by_runways[n, ct], coll <- [n, ct]; + ?[max(total), collect(coll)] := two_hops[total], out_by_runways[n, ct], coll = [n, ct]; "#, ¶ms, )?; @@ -646,7 +646,7 @@ fn air_routes() -> Result<()> { let const_return_time = Instant::now(); let res = db.run_script( r#" - ?[name, count(a)] := [a airport.region 'US-OK'], name <- 'OK'; + ?[name, count(a)] := [a airport.region 'US-OK'], name = 'OK'; "#, ¶ms, )?; @@ -676,7 +676,7 @@ fn air_routes() -> Result<()> { let multi_unification_time = Instant::now(); let res = db.run_script(r#" target_airports[collect(a, 5)] := [a airport.iata _]; - ?[code, count(r)] := target_airports[targets], a <- ..targets, [a airport.iata code], [r route.src a]; + ?[code, count(r)] := target_airports[targets], a in targets, [a airport.iata code], [r route.src a]; "#, ¶ms, )?; dbg!(multi_unification_time.elapsed()); @@ -697,7 +697,7 @@ fn air_routes() -> Result<()> { [r route.src a], [r route.dst a2], [a2 airport.country us]; - ?[n] := routes[rs], n <- length(rs); + ?[n] := routes[rs], n = length(rs); "#, ¶ms, )?; @@ -788,7 +788,7 @@ fn air_routes() -> Result<()> { [r route.src a], [r route.dst a2], [a2 airport.city city_name], - n <- length(city_name); + n = length(city_name); "#, ¶ms, )?; @@ -800,7 +800,7 @@ fn air_routes() -> Result<()> { r#" route_count[count(r), a] := [r route.src a]; rc[max(n), a] := route_count[n, a]; - rc[max(n), a] := [a airport.iata _], n <- 0; + rc[max(n), a] := [a airport.iata _], n = 0; ?[n, count(a)] := rc[n, a]; :order n; :limit 10; @@ -820,7 +820,7 @@ fn air_routes() -> Result<()> { let res = db.run_script( r#" route_count[count(r), a] := [r route.src a]; - rc[max(n), a] := route_count[n, a] or ([a airport.iata _], n <- 0); + rc[max(n), a] := route_count[n, a] or ([a airport.iata _], n = 0); ?[mean(n)] := rc[n, _]; "#, ¶ms, @@ -899,7 +899,7 @@ fn air_routes() -> Result<()> { eng_aps[a] := [a airport.region 'GB-ENG']; ?[pair] := eng_aps[a1], [r route.src a1], [r route.dst a2], eng_aps[a2], [a1 airport.iata src], [a2 airport.iata dst], - pair <- sorted([src, dst]); + pair = sorted([src, dst]); "#, ¶ms, )?; @@ -922,10 +922,10 @@ fn air_routes() -> Result<()> { r#" reachable[a, choice(p)] := [s airport.iata 'AUS'], [r route.src s], [r route.dst a], - [a airport.iata code], code != 'YYZ', p <- ['AUS', code]; + [a airport.iata code], code != 'YYZ', p = ['AUS', code]; reachable[a, choice(p)] := reachable[b, prev], [r route.src b], [r route.dst a], [a airport.iata code], - code != 'YYZ', p <- append(prev, code); + code != 'YYZ', p = append(prev, code); ?[p] := reachable[a, p], [a airport.iata 'YPO']; :limit 1; @@ -948,7 +948,7 @@ fn air_routes() -> Result<()> { [r route.src ind_a], [r route.dst na_a], [na_a airport.country dst_country], [dst_country country.code dst_country_name], - dst_country_name <- ..['US', 'CA'], + dst_country_name in ['US', 'CA'], [ind_a airport.iata ind_c], [na_a airport.iata na_c]; "#, @@ -992,7 +992,7 @@ fn air_routes() -> Result<()> { r#" ?[code] := [a airport.iata 'CLT'], [r route.src a], [r route.dst a2], [cont geo.contains a2], [cont continent.code c_name], - c_name <- ..['EU', 'SA'], + c_name in ['EU', 'SA'], [a2 airport.iata code]; "#, ¶ms, @@ -1009,7 +1009,7 @@ fn air_routes() -> Result<()> { let london_to_us_time = Instant::now(); let res = db.run_script( r#" - ?[l_code, us_code] := l_code <- ..['LHR', 'LCY', 'LGW', 'LTN', 'STN'], + ?[l_code, us_code] := l_code in ['LHR', 'LCY', 'LGW', 'LTN', 'STN'], [a airport.iata l_code], [r route.src a], [r route.dst a2], [us country.code 'US'], @@ -1085,7 +1085,7 @@ fn air_routes() -> Result<()> { let three_cities_time = Instant::now(); let res = db.run_script( r#" - three[a] := city <- ..['London', 'Munich', 'Paris'], [a airport.city city]; + three[a] := city in ['London', 'Munich', 'Paris'], [a airport.city city]; ?[src, dst] := three[s], [r route.src s], [r route.dst d], three[d], [s airport.iata src], [d airport.iata dst]; "#, @@ -1192,7 +1192,7 @@ fn air_routes() -> Result<()> { let total_distance_from_three_cities_time = Instant::now(); let res = db.run_script( r#" - three[a] := city <- ..['London', 'Munich', 'Paris'], [a airport.city city]; + three[a] := city in ['London', 'Munich', 'Paris'], [a airport.city city]; ?[sum(dist)] := three[a], [r route.src a], [r route.distance dist]; "#, ¶ms, @@ -1203,7 +1203,7 @@ fn air_routes() -> Result<()> { let total_distance_within_three_cities_time = Instant::now(); let res = db.run_script( r#" - three[a] := city <- ..['London', 'Munich', 'Paris'], [a airport.city city]; + three[a] := city in ['London', 'Munich', 'Paris'], [a airport.city city]; ?[sum(dist)] := three[a], [r route.src a], [r route.dst a2], three[a2], [r route.distance dist]; "#, @@ -1241,7 +1241,7 @@ fn air_routes() -> Result<()> { r#" ?[code, dist] := [s airport.iata 'AUS'], [r1 route.src s], [r1 route.dst a], [r2 route.src a], [r2 route.dst d], [d airport.iata 'LHR'], - [r1 route.distance dis1], [r2 route.distance dis2], dist <- dis1 + dis2, + [r1 route.distance dis1], [r2 route.distance dis2], dist = dis1 + dis2, [a airport.iata code]; :order dist; :limit 10; @@ -1283,7 +1283,7 @@ fn air_routes() -> Result<()> { let north_of_77_time = Instant::now(); let res = db.run_script(r#" - ?[city, latitude] := [a airport.lat lat], lat > 77, [a airport.city city], latitude <- round(lat); + ?[city, latitude] := [a airport.lat lat], lat > 77, [a airport.city city], latitude = round(lat); "#, ¶ms, )?; dbg!(north_of_77_time.elapsed()); @@ -1329,7 +1329,7 @@ fn air_routes() -> Result<()> { [us country.code 'US'], [r route.src dfw], [r route.dst a], [a airport.country us], - region <- ..['US-CA', 'US-TX', 'US-FL', 'US-CO', 'US-IL'], + region in ['US-CA', 'US-TX', 'US-FL', 'US-CO', 'US-IL'], [a airport.region region], [a airport.iata code]; "#, @@ -1350,7 +1350,7 @@ fn air_routes() -> Result<()> { r#" ?[deg_diff] := [a airport.iata 'SFO'], [a airport.lat a_lat], [a airport.lon a_lon], [b airport.iata 'NRT'], [b airport.lat b_lat], [b airport.lon b_lon], - deg_diff <- round(haversine_deg_input(a_lat, a_lon, b_lat, b_lon)); + deg_diff = round(haversine_deg_input(a_lat, a_lon, b_lat, b_lon)); "#, ¶ms, )?; @@ -1365,11 +1365,11 @@ fn air_routes() -> Result<()> { routes[a2, shortest(path)] := [a airport.iata 'AUS'], [r route.src a], [r route.dst a2], us_uk_airports[a2], [a2 airport.iata dst], - path <- ['AUS', dst]; + path = ['AUS', dst]; routes[a2, shortest(path)] := routes[a, prev], [r route.src a], [r route.dst a2], us_uk_airports[a2], [a2 airport.iata dst], - path <- append(prev, dst); + path = append(prev, dst); ?[path] := [edi airport.iata 'EDI'], routes[edi, path]; "#, ¶ms, @@ -1383,12 +1383,12 @@ fn air_routes() -> Result<()> { routes[a2, shortest(path)] := [a airport.iata 'LHR'], [r route.src a], [r route.dst a2], [a2 airport.iata dst], - path <- ['LHR', dst]; + path = ['LHR', dst]; routes[a2, shortest(path)] := routes[a, prev], [r route.src a], [r route.dst a2], [a2 airport.iata dst], - path <- append(prev, dst); - ?[len, path] := routes[_, path], len <- length(path); + path = append(prev, dst); + ?[len, path] := routes[_, path], len = length(path); :order -len; :limit 10; @@ -1418,15 +1418,15 @@ fn air_routes() -> Result<()> { [r route.dst a2], [r route.distance dist], [a2 airport.iata dst], - path <- ['LHR', dst], - cost_pair <- [path, dist]; + path = ['LHR', dst], + cost_pair = [path, dist]; routes[a2, min_cost(cost_pair)] := routes[a, prev], [r route.src a], [r route.dst a2], [r route.distance dist], [a2 airport.iata dst], - path <- append(first(prev), dst), - cost_pair <- [path, last(prev) + dist]; - ?[cost, path] := routes[dst, cost_pair], cost <- last(cost_pair), path <- first(cost_pair); + path = append(first(prev), dst), + cost_pair = [path, last(prev) + dist]; + ?[cost, path] := routes[dst, cost_pair], cost = last(cost_pair), path = first(cost_pair); :order -cost; :limit 10; @@ -1453,13 +1453,13 @@ fn air_routes() -> Result<()> { r#" routes[a2, min_cost(cost_pair)] := [a airport.iata 'LHR'], :flies_to[a, a2, dist], [a2 airport.iata dst], - path <- ['LHR', dst], - cost_pair <- [path, dist]; + path = ['LHR', dst], + cost_pair = [path, dist]; routes[a2, min_cost(cost_pair)] := routes[a, prev], :flies_to[a, a2, dist], [a2 airport.iata dst], - path <- append(first(prev), dst), - cost_pair <- [path, last(prev) + dist]; - ?[cost, path] := routes[dst, cost_pair], cost <- last(cost_pair), path <- first(cost_pair); + path = append(first(prev), dst), + cost_pair = [path, last(prev) + dist]; + ?[cost, path] := routes[dst, cost_pair], cost = last(cost_pair), path = first(cost_pair); :order -cost; :limit 10;