2011-11-11 4 views
1

프롤로그에 뭔가를 쓰고 있는데, 내가 추가를 사용하면 [a, b, c | _]와 같은 목록이 반환됩니다. 모든 초기화되지 않은/임의의 값을 잘라내는 표준 술어 (또는 간단한 방법)가 있습니까?초기화되지 않은 목록 값을 프롤로그에서 자르지 않음

편집 추가 : 길이가 임의의 길이 일 수 있기 때문에 길이가 작동하지 않습니다. 미리 시간이 얼마인지 알지 못합니다. 그렇지 않으면 이미 트리밍에 사용했을 것입니다.

답변

3

왜 append가 그런 목록을 제공하는지 확인해야합니다. 당신이보고있는 문제를 해결 APPEND의 행동을 관찰하기 때문에 :

?- append([a,b,c|_], X, L). 
L = [a,b,c|X] 
?- append([a,b,c|_], X, L), X=[]. 
L = [a,b,c] 
+0

확인했는데 내 술어 중 하나의 기본 사례가 꺼져있는 것처럼 보입니다. 감사. – LinearZoetrope

1

는이 같은 열린 목록을 닫을 수 있습니다 :

close_list([]) :- !. 

close_list([_ | T]) :- 
    close_list(T). 

당신이 변수에 도달하는 모든 요소를 ​​걸어야 즉 tail을 입력 한 다음 빈 목록에 바인딩합니다.

사용법 : 당신이 꼬리에 바인딩 된 변수를 누르고 있으면

?- List = [a, b, C, d, 2.2 | _], close_list(List). 
List = [a, b, C, d, 2.2]. 

다음은 훨씬 간단하게 :

?- List = [a, b, C, d, 2.2 | Tail], Tail = []. 
List = [a, b, C, d, 2.2], 
Tail = []. 
2

당신은이를 위해 length/2를 사용할 수 있습니다!

?- Xs = [1,2,3|_], length(Xs, N). 
Xs = [1,2,3], 
N = 3 ; 
Xs = [1,2,3,_G1022], 
N = 4 ; 
Xs = [1,2,3,_G1022,_G1025], 
N = 5 

그러나 여기에 설명하려는 내용이 분명하지 않습니다. 가장 작은 솔루션을 계속 사용하려면 once(length(Xs, N))을 대신 사용하십시오.

2

리스트가 []으로 종료되지 않은 경우 목록을 잘못 작성하는 것이 좋습니다.

관련 문제