2017-10-28 2 views
2

그래서 프롤로그에 대한 기본 프로그래밍을 배우고 있으며 몇 가지 문제가 있습니다. 프롤로그에서 append를 사용하여 목록에서 첫 번째 X 번호의 요소를 제거합니다 (X는 입력 한 임의의 숫자 임). 목록이 비어 있고 목록에 포함 된 것 이상을 요청한 경우에도 문제가 발생합니다. [[]을 (를) 반환해야합니다. 예 입력. 이동식 (R, [1,2,3는, 5)목록이 비어있을 때 프롤로그 프로그램이 중지되지 않게하는 방법

removable(A,B,N) :- length(X,N), append(X, A, B). 

답변

1

시도 이런 lengthappend 및 사용을 피해야한다. 그것은 당신의 코드를리스트를 통해 반복적으로 만듭니다.

대신,이 시도 :

removable(0,R,R). 
removable(X,[],[]) :- X > 0. 
removable(X,[H|T],R) :- X > 0, Y is X - 1, removable(Y,T,R). 

내가 입력이 오른쪽에 왼쪽과 출력에있는 규칙을 준수하여 인수의 순서를 변경했습니다 유의하시기 바랍니다.

귀하의 호출은 다음과 같다 :

?- removable(5,[1,2,3,a],R), write(R). 

[]를 출력.

-1

프롤로그에서는 재귀를 사용하여 작업하고 머리글과 꼬리를 사용하는 것이 좋습니다. 인스턴스화 된 3 개의 모든 vaiables가 있으므로 프롤로그가 예를 들어 a와 같은 용어를 인스턴스화 할 수 없습니다.

removable(A,B,N) :- 
    removable(A,B,N,0). % This is just another call with accumulator. 



removable(L,L,Acc,Acc). %This is your base case, When Acc and Acc will equal then prolog will find one succesive branch. 

removable([],[],_,_). %This base case says that no matter what values Accs have if a list is emepty then substitue other also with empty list and return result. 

removable(R,[H|T],N,Acc) :- %This predicates removes H and keeps counting when removed elements equal to N then first(base case) will succeed. 
    NewAcc is Acc + 1, 
    removable(R,T,N,NewAcc). 

.

관련 문제