Мы определяем slice/4
на основе append/3
и length/2
, как это определено в Прологе Пролога а>:
slice(AsBsCs,P,Q,Bs) :-
append(AsBs,_Cs,AsBsCs),
append(As , Bs,AsBs ),
length([_|As],P),
length( AsBs ,Q).
Пример запроса, предоставленный OP:
?- slice([a,b,c,d,e,f,g,h,i,k],3,7,Xs).
Xs = [c,d,e,f,g] ;
false.
Давайте обобщим вышеуказанный запрос следующим образом:
?- slice([a,b,c,d,e,f,g,h,i,k],P,7,Xs).
P = 1, Xs = [a,b,c,d,e,f,g]
; P = 2, Xs = [b,c,d,e,f,g]
; P = 3, Xs = [c,d,e,f,g]
; P = 4, Xs = [d,e,f,g]
; P = 5, Xs = [e,f,g]
; P = 6, Xs = [f,g]
; P = 7, Xs = [g]
; P = 8, Xs = []
; false.
Как насчет обобщения по-другому?
?- slice([a,b,c,d,e,f,g,h,i,k],3,Q,Xs).
; Q = 2, Xs = []
; Q = 3, Xs = [c]
; Q = 4, Xs = [c,d]
; Q = 5, Xs = [c,d,e]
; Q = 6, Xs = [c,d,e,f]
; Q = 7, Xs = [c,d,e,f,g]
; Q = 8, Xs = [c,d,e,f,g,h]
; Q = 9, Xs = [c,d,e,f,g,h,i]
; Q = 10, Xs = [c,d,e,f,g,h,i,k]
; false.
Наконец, мы запускаем запрос, который является обобщением обоих:
?- slice([a,b,c,d,e,f,g,h,i,k],P,Q,Xs).
P = 1, Q = 0, Xs = []
; P = 1, Q = 1, Xs = [a]
; P = 2, Q = 1, Xs = []
; P = 1, Q = 2, Xs = [a,b]
; P = 2, Q = 2, Xs = [b]
; P = 3, Q = 2, Xs = []
; P = 1, Q = 3, Xs = [a,b,c]
; P = 2, Q = 3, Xs = [b,c]
; P = 3, Q = 3, Xs = [c]
; P = 4, Q = 3, Xs = []
; P = 1, Q = 4, Xs = [a,b,c,d]
; P = 2, Q = 4, Xs = [b,c,d]
; P = 3, Q = 4, Xs = [c,d]
; P = 4, Q = 4, Xs = [d]
; P = 5, Q = 4, Xs = []
; P = 1, Q = 5, Xs = [a,b,c,d,e]
; P = 2, Q = 5, Xs = [b,c,d,e]
; P = 3, Q = 5, Xs = [c,d,e]
; P = 4, Q = 5, Xs = [d,e]
; P = 5, Q = 5, Xs = [e]
; P = 6, Q = 5, Xs = []
; P = 1, Q = 6, Xs = [a,b,c,d,e,f]
; P = 2, Q = 6, Xs = [b,c,d,e,f]
; P = 3, Q = 6, Xs = [c,d,e,f]
; P = 4, Q = 6, Xs = [d,e,f]
; P = 5, Q = 6, Xs = [e,f]
; P = 6, Q = 6, Xs = [f]
; P = 7, Q = 6, Xs = []
; P = 1, Q = 7, Xs = [a,b,c,d,e,f,g]
; P = 2, Q = 7, Xs = [b,c,d,e,f,g]
; P = 3, Q = 7, Xs = [c,d,e,f,g]
; P = 4, Q = 7, Xs = [d,e,f,g]
; P = 5, Q = 7, Xs = [e,f,g]
; P = 6, Q = 7, Xs = [f,g]
; P = 7, Q = 7, Xs = [g]
; P = 8, Q = 7, Xs = []
; P = 1, Q = 8, Xs = [a,b,c,d,e,f,g,h]
; P = 2, Q = 8, Xs = [b,c,d,e,f,g,h]
; P = 3, Q = 8, Xs = [c,d,e,f,g,h]
; P = 4, Q = 8, Xs = [d,e,f,g,h]
; P = 5, Q = 8, Xs = [e,f,g,h]
; P = 6, Q = 8, Xs = [f,g,h]
; P = 7, Q = 8, Xs = [g,h]
; P = 8, Q = 8, Xs = [h]
; P = 9, Q = 8, Xs = []
; P = 1, Q = 9, Xs = [a,b,c,d,e,f,g,h,i]
; P = 2, Q = 9, Xs = [b,c,d,e,f,g,h,i]
; P = 3, Q = 9, Xs = [c,d,e,f,g,h,i]
; P = 4, Q = 9, Xs = [d,e,f,g,h,i]
; P = 5, Q = 9, Xs = [e,f,g,h,i]
; P = 6, Q = 9, Xs = [f,g,h,i]
; P = 7, Q = 9, Xs = [g,h,i]
; P = 8, Q = 9, Xs = [h,i]
; P = 9, Q = 9, Xs = [i]
; P = 10, Q = 9, Xs = []
; P = 1, Q = 10, Xs = [a,b,c,d,e,f,g,h,i,k]
; P = 2, Q = 10, Xs = [b,c,d,e,f,g,h,i,k]
; P = 3, Q = 10, Xs = [c,d,e,f,g,h,i,k]
; P = 4, Q = 10, Xs = [d,e,f,g,h,i,k]
; P = 5, Q = 10, Xs = [e,f,g,h,i,k]
; P = 6, Q = 10, Xs = [f,g,h,i,k]
; P = 7, Q = 10, Xs = [g,h,i,k]
; P = 8, Q = 10, Xs = [h,i,k]
; P = 9, Q = 10, Xs = [i,k]
; P = 10, Q = 10, Xs = [k]
; P = 11, Q = 10, Xs = []
; false.
person
repeat
schedule
18.08.2015