2009-06-27 4 views
-1

저는 프롤로그로 시작했는데, 다음과 같은 이유가 예상대로 작동하지 않는 이유를 알 수 없습니다. 리스트 L2가 L1에 포함되어 있으면 참을 리턴하는 술어를 작성하려고합니다. 이 내가 쓴 것입니다 : 프롤로그 술어 문제

assert(contains (L1, L1)). 
assert(contains(L1, [X|L2]):-member(X, L1), contains(L1, L2)). 
assert(contains(L1, [])). 

나는이에 해당 될 것입니다 생각 "의 X의 경우 'L3 = X | L2'는 L1이며, 또한 L2는 L1에 다음 사실이다"를 포함하여, (L1, L2)은 모든 구성원이 통과되고 마지막 옵션이 남거나 L1에없는 구성원을 찾을 때까지 재귀 적으로 변환되어 술어에서 실패합니다.

불행히도 그런 식으로 작동하지 않는 것 같습니다. 그것은 ([1,2,3], [1,4,5]) 패스를 포함하지만 멤버 (X, L1)의 값만 반환하는 것으로 보이지만 ([1,2,3], [4, 1,5])는 그렇지 않습니다.

내가 뭘 잘못하고 있니?

+0

어떤 Prolog 구현을 사용하고 있습니까? 나는 SWI-Prolog에서 문제를 재현 할 수 없다. – mercator

+0

SWI-Prolog 버전 2.7.12 –

+3

2.7.12? 정말?! 5.6.x 나 5.7.x와 같은 새로운 것을 사용해보십시오. – Kaarel

답변

5

나는 완전히 질문을 이해하지 않았다하지만이 같은 contains/2 술어 작성합니다 당신의 첫 번째 규칙 (사실은)

contains (L1, L1). 

에 구문 오류가 있습니다 BTW,

% An empty list is contained by any list 
contains(_, []). 

% If a list is not empty, then its 
% first element must be an element of L1, 
% and its tail must be contained by L1. 
contains(L1, [X | L2]) :- 
    member(X, L1), 
    contains(L1, L2). 

을 (술어 이름 뒤에 공백이 없어야 함). 또한 수정하면 원하지 않는 선택 점이 생깁니다. 따라서 삭제하십시오. 경우

당신은 다음

?- assert(contains(_, [])). 

Yes 
?- assert(contains(L1, [X | L2]) :- (member(X, L1), contains(L1, L2))). 

Yes 

지식 기반에 끝난 것을 확인하려면, listing/0을 사용하여 실행합니다 프롤로그 프롬프트에 assert/1를 사용하고 싶습니다.

?- listing. 

:- dynamic contains/2. 

contains(_, []). 
contains(B, [A|C]) :- 
    member(A, B), 
    contains(B, C). 

Yes 

나는 자신의 대답에 "자유 변수 주장"이 있다고 생각하지 않습니다. 오히려 브라케팅을 확인하십시오.

+0

나는 당신이 물어 보았던 것과 같은 문제가있다 : 내가 contains ([1,2,3], [1,2,4])를 호출하면, "yes"로 응답한다. –

+0

이상하게, 내 경우에 대답한다. "그릇된." – Kaarel

-2

무료 변수에 대한 어설 션을 사용하면 분명히 문제가 발생할 수 있습니다 (적어도이 버전에서는). assert를 삭제하고 consult (file) 명령을 사용하면이를 해결했습니다.

+0

원래의 질문은 단언에 대해서 아무 말도하지 않습니다. 정확히 당신은 무엇을 주장 했습니까? – Kaarel

+0

나는 기본적으로 그것을 프롬프트에 썼다. 그래서 나는 모든 것을 주장했다. 게시 된 코드에 어설 션을 추가했습니다. –