@Boris의 대답은 첫 번째 인수 목록의 길이를 알 수 없을 때 종료되지 않습니다. 이 참조하기 위해, failure-slice와 첫 번째 목표보다 더 보일 필요가 없습니다 : 한편
div(L, L1, L2, L3) :-
length(L, Len), false,
% here you compute for example Len1 and Len2
length(L1, Len1),
length(L2, Len2),
append(L1, L1_suffix, L),
append(L2, L3, L1_suffix).
, 원래이 프로그램은 quite nice termination properties했다.
즉
div(A,B,C,D) terminates_if b(A);b(B);b(C);b(D).
는, 종료를 보장하기 위해, 당신은 단지 (중 A
또는 B
또는 C
또는 D
가) (유한 접지입니다 구체적인 목록이 될 수있는 하나의 인수가 필요합니다 CTI는 다음과 같은 최적의 종료 속성을 준 그것은 무엇입니까 b(..)
의미). 그것은 매우 강한 종료 조건입니다. 인수가 맞지 않는 것은 정말 유감입니다! 왜 프로그램을 일반화하지 않습니까? 유일한 문제는 목록 요소를 제한한다는 것입니다. 그래서 _
들에 의해리스트의 모든 요소 변수 이름을 대체합니다 :
gdiv([], [], [], []).
gdiv([_], [_], [], []).
gdiv([_,_], [_], [_], []).
gdiv([_,_,_|End], [_|XEnd], [_|YEnd], [_|ZEnd]):-
gdiv(End, XEnd, YEnd, ZEnd).
very same 종료 속성은이 프로그램십시오.
아아, 지금은 너무 일반적입니다.보리스의 솔루션은 이제 용도 변경 할 수 있습니다 동일한을 표현하는
divnew(Zs, As, Bs, Cs) :-
gdiv(Zs, As, Bs, Cs),
append(As, BsCs, Zs),
append(Bs, Cs, BsCs).
내 선호하는 방법은 오히려 것 :
divnew(Zs, As, Bs, Cs) :-
gdiv(Zs, As, Bs, Cs),
phrase((seq(As), seq(Bs), seq(Cs)), Zs).
이 seq//1
의 정의에 대한 other answers를 참조하십시오.
감사합니다. @ 실수. 나는 또한 당신이이 질문의 바깥에 나를 보여 주려고했는지 이해합니다. – Mocking