import('rules2cp/lib/common/rcp'). first = {start=_, duration=0}. a1 = {start=_, duration=4}. a2 = {start=_, duration=2}. a3 = {start=_, duration=2}. a4 = {start=_, duration=2}. a5 = {start=_, duration=2}. a6 = {start=_, duration=5}. p1 = {start=_, duration=20}. p2 = {start=_, duration=13}. ue = {start=_, duration=10}. s1 = {start=_, duration=8}. s2 = {start=_, duration=4}. s3 = {start=_, duration=4}. s4 = {start=_, duration=4}. s5 = {start=_, duration=4}. s6 = {start=_, duration=10}. b1 = {start=_, duration=1}. b2 = {start=_, duration=1}. b3 = {start=_, duration=1}. b4 = {start=_, duration=1}. b5 = {start=_, duration=1}. b6 = {start=_, duration=1}. ab1 = {start=_, duration=1}. ab2 = {start=_, duration=1}. ab3 = {start=_, duration=1}. ab4 = {start=_, duration=1}. ab5 = {start=_, duration=1}. ab6 = {start=_, duration=1}. m1 = {start=_, duration=16}. m2 = {start=_, duration=8}. m3 = {start=_, duration=8}. m4 = {start=_, duration=8}. m5 = {start=_, duration=8}. m6 = {start=_, duration=20}. l1 = {start=_, duration=2}. t1 = {start=_, duration=12}. t2 = {start=_, duration=12}. t3 = {start=_, duration=12}. t4 = {start=_, duration=12}. t5 = {start=_, duration=12}. ua = {start=_, duration=10}. v1 = {start=_, duration=15}. v2 = {start=_, duration=10}. k1 = {start=_, duration=0}. k2 = {start=_, duration=0}. last = {start=_, duration=0}. cost = start(last). end(Task) = start(Task) + duration(Task). maxDuration = sum(map(T, tasks, duration(T))). tasks = [first, a1, a2, a3, a4, a5, a6, p1, p2, ue, s1, s2, s3, s4, s5, s6, b1, b2, b3, b4, b5, b6, ab1, ab2, ab3, ab4, ab5, ab6, m1, m2, m3, m4, m5, m6, l1, t1, t2, t3, t4, t5, ua, v1, v2, k1, k2, last]. precedences_list = [[first, a1], [first, a2], [first, a3], [first, a4], [first, a5], [first, a6], [first, ue], [a1, s1], [a2, s2], [a5, s5], [a6, s6], [a3, p1], [a4, p2], [p1, s3], [p2, s4], [p1, k1], [p2, k1], [s1, b1], [s2, b2], [s3, b3], [s4, b4], [s5, b5], [s6, b6], [b1, ab1], [b2, ab2], [b3, ab3], [b4, ab4], [b5, ab5], [b6, ab6], [ab1, m1], [ab2, m2], [ab3, m3], [ab4, m4], [ab5, m5], [ab6, m6], [m1, t1], [m2, t1], [m2, t2], [m3, t2], [m3, t3], [m4, t3], [m4, t4], [m5, t4], [m5, t5], [m6, t5], [m1, k2], [m2, k2], [m3, k2], [m4, k2], [m5, k2], [m6, k2], [l1, t1], [l1, t2], [l1, t3], [l1, t4], [l1, t5], [t1, v1], [t5, v2], [t2, last], [t3, last], [t4, last], [v1, last], [v2, last], [ua, last], [k1, last], [k2, last]]. resource_crane = [l1, t1, t2, t3, t4, t5]. resource_bricklaying = [m1, m2, m3, m4, m5, m6]. resource_schal = [s1, s2, s3, s4, s5, s6]. resource_excavator = [a1, a2, a3, a4, a5, a6]. resource_ram = [p1, p2]. resource_pump = [b1, b2, b3, b4, b5, b6]. resource_caterpillar = [v1, v2]. resources = [resource_crane, resource_bricklaying, resource_schal, resource_excavator, resource_ram, resource_pump, resource_caterpillar]. max_nf_list = [[first, l1, 30], [a1, s1, 3], [a2, s2, 3], [a5, s5, 3], [a6, s6, 3], [p1, s3, 3], [p2, s4, 3]]. min_sf_list = [[ua, m1, 2], [ua, m2, 2], [ua, m3, 2], [ua, m4, 2], [ua, m5, 2], [ua, m6, 2]]. max_ef_list = [[s1, b1, 4], [s2, b2, 4], [s3, b3, 4], [s4, b4, 4], [s5, b5, 4], [s6, b6, 4]]. min_nf_list = [[first, l1, 30]]. min_af_list = [[ue, s1, 6], [ue, s2, 6], [ue, s3, 6], [ue, s4, 6], [ue, s5, 6], [ue, s6, 6]]. %% rules %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% max_nf(T1, T2, N) --> start(T2) =< end(T1) + N. min_nf(T1, T2, N) --> start(T2) >= start(T1) + duration(T1) + N. max_ef(T1, T2, N) --> end(T2) =< end(T1) + N. min_af(T1, T2, N) --> start(T2) >= start(T1) + N. min_sf(T1, T2, N) --> end(T2) =< start(T1) + N. distances --> forall(T, max_nf_list, max_nf(nth(1, T), nth(2, T), nth(3, T))) and forall(T, min_sf_list, min_sf(nth(1, T), nth(2, T), nth(3, T))) and forall(T, max_ef_list, max_ef(nth(1, T), nth(2, T), nth(3, T))) and forall(T, min_nf_list, min_nf(nth(1, T), nth(2, T), nth(3, T))) and forall(T, min_af_list, min_af(nth(1, T), nth(2, T), nth(3, T))). tasks_domain --> domain(tasks, 0, maxDuration). prec(T1, T2) --> end(T1) =< start(T2). precedences --> forall(TaskPair, precedences_list, prec(nth(1, TaskPair), nth(2, TaskPair))). disj(T1, T2) --> prec(T1, T2) or prec(T2, T1). disj_pairs(Tasks) --> forall(T1, Tasks, forall(T2, Tasks, uid(T1) < uid(T2) implies disj(T1, T2))). disjunctives --> forall(Tasks, resources, disj_pairs(Tasks)). minimize_completion_time --> conjunct_ordering([greatest(duration(A) + duration(B) if ^ is disj(A, B))]) and % disjunct_ordering([greatest(duration(A) if ^ is prec(A, B))]) and minimize(disjunctives, cost). ? tasks_domain and precedences and distances and disjunctives and minimize_completion_time. % Cream %% 271 %% 131 %% 129 %% 125 %% 121 %% 117 %% 109 %% 105 %% 103 %% 0.380 seconds %% 167 bactracks % Rules2CP %% 271 %% 131 %% 129 %% 125 %% 121 %% 117 %% 109 %% 105 %% 103 %% 0.150 seconds %% 367 bactracks