2013-06-01 6 views
0

프롤로그의 정렬 된 목록에서 요소를 제거하는 술어를 작성하려고합니다. 이것은 숙제의 일부이며 Prolog의 의미 체계가 일반적으로 어떻게 작동하는지 혼란 스럽습니다.프롤로그에서 목록을 올바르게 작성하십시오.

목표가 rdup([1,2], L). 인 다음 함수를 사용하면 false이됩니다. 나는 목표를 추적했으며, 필자가 재귀 호출을 사용하여 결과 목록을 구축하는 방식으로 구축하지 않아야하는 것처럼 보입니다. 결과 목록을 어떻게 작성해야하는지 확신 할 수 없습니다. 여기에 함수는 다음과 같습니다

내 추론이 잘못된 방법이나 하나의 프롤로그에서 반복적으로 목록을 구축하기로된다
rdup([],M). 
rdup([X],[X]). 
rdup([H1,H2|T], M) :- H1 \= H2, rdup(T, [M,H1,H2]). 
rdup([H1,_|T], M) :- rdup(T, [M,H1]). 

사람이 말해 줄래?

답변

3

우선, 이 아니고 기능입니다. 그것은 술어입니다. 그들은 진실하고 진실하지 않고, 어떤 조건 하에서 만 말합니다. 설명의

rdup([],[]). 
rdup([X],[X]). 
rdup([H,H|T], M) :- rdup([H|T], M). 
rdup([H1,H2|T], [H1|M]) :- H1 \= H2, rdup([H2|T], M). 

이제 조금 : 여기

는 프로그램입니다.

첫째, "rdup (X, Y)"는 무엇입니까? "X에서 순서가 지정된 목록을 가져 와서 Y에 중복없이 목록 X 넣기"라고 말하지 않지만 "Y는 중복이없는 목록 X이면 X는 순서가 지정된 목록입니다"라는 말은 사실입니다. 우리가 "가치를 반환하는 것"에 대해 이야기하지 않는다는 것을 주목하십시오.

첫 번째 줄에 비어있는 목록은 빈 목록이 중복되지 않은 목록이라고 나와 있습니다. 확실히 명백한, 맞죠?

다음 줄은 기본적으로 동일하지만 하나의 요소가 있습니다.

세 번째 줄은 두 개의 동일한 요소 H와 tail T로 구성된 목록이있는 경우이 목록의 정렬 된 목록 ([H, H | T])은 요소 H가 하나뿐입니다. 따라서 우리는 두 술어 모두에서 "M"을 수정하지 않은 것입니다.

독자가 마지막 술어를 분석해보기를 바란다. Prolog는보기에 어렵지 않다. 행운을 빕니다!

+1

'(\ =)/2' 대신에'dif/2'를 쓰면'? - rdup ([X, Y, Z)]와 같은 앤서 쿼리 ], Ls) .' – mat

관련 문제