2016-06-04 9 views
2

this과 비슷한 목록에있는 요소의 모든 요소를 ​​제거하고 싶지만,이 경우 목록에 인스턴스화되지 않은 변수가있을 수 있습니다. 예를 들어 :프롤로그 : 인스턴스화되지 않은 값을 가진 목록의 구성원을 제거하십시오.

delMember(z, [A,B,A,z], L). 
L = [A, B, A]; 
false. 

delMember(A, [A, B, A, z], L). 
L = [B,z]; 
false. 

나는 다음과 같은 delMember을 정의하는 노력이 정의와

delMember(_, [], []). 
delMember(X, [X|Xs], Y) :- delMember(X, Xs, Y). 
delMember(X, [T|Xs], [T|Y]) :- X \== T, delMember(X, Xs, Y). 

, 내가 할 마지막 결과는 정확하지만 여전히하려고 그 전에 변수를 인스턴스화합니다.

?- delMember(A, [A,B,A,z], R). 
A = B, B = z, 
R = [] ; 
A = B, 
R = [z] ; 
A = z, 
R = [B] ; 
R = [B, z] ; 

어떤 아이디어 ???

+2

: 그래서 완전한 조건과 같을 것이다 (일부 약간 변경 변수 이름은보다 전통적인 될 수 있습니다)'delMember (X, [X | X가, Y) : - delMember (X, Xs, Y) .'는 첫 번째 인수를 두 번째 인수에있는 목록의 머리글과 통합 할 수있는 경우이를 통합합니다. 당신이 그것을 피하려고하기 때문에'=='를 사용해야합니다 : delMember (X, [Y | Xs], R) : - X == Y, delMember (X, Xs, R) .' – lurker

+0

@lurker 감사합니다! 그것은 내가 필요로했던 바로 그 것이었다. 그 대답을하고 싶다면 그것을 기꺼이 받아 들일 것입니다. – lithiium

답변

1

당신이 두 번째 술어 절을 보면 : 통일은 제 1 및 제 2 인자의 X으로 발생하는

delMember(X, [X|Xs], Y) :- delMember(X, Xs, Y). 

. 이로 인해 쿼리를 수행 할 때 관찰 한 결과가 발생합니다. 세 번째 절에서 사용한 것과 동일한 연산자를 적용해야합니다. 통일이 두 번째 절에서 발생하는

delMember(_, [], []). 
delMember(X, [X1|Xs], Ys) :- X == X1, delMember(X, Xs, Ys). 
delMember(X, [X1|Xs], [X1|Ys]) :- X \== X1, delMember(X, Xs, Ys).