2011-02-27 2 views
0
 findThree([H|T],_,3).  
     findThree([H|T], M, Z):- 
      (member(H,M) 
       -> Z2 is Z + 1, 
       select(H,M,C), 
       findThree(T,C,Z2) 
       ;select(H,M,C), 
       findThree(T,C,Z) 
      ). 

그럼 내가하려는 것은 요소가 지정된 목록에 있는지 확인하는 것입니다. 그렇다면 변수를 증가시키고 그 중 3 개가 발견되면 중지합니다. 그러나 이것이 내 구문에 문제가되는 것은 아닌가? SWI-Prolog에서 If-else 구문을 사용하려고합니다. 그게 문제가 될 수 있니?Prolog에서이 술어에 문제점이 있습니까?

+0

내가 프롤로그에 대해 잘 모르겠지만, 내가 "변수를 증가"고 알고 당신이 할 수없는 일이다. 좀 더 선언적인 접근 방식을 시도해보십시오 (별로 도움이되지 않습니다). – luqui

답변

1

Z is Z + 1은 항상 정수로 실패합니다. Z + 1의 값을 계산 한 다음 Z과 통합하려고합니다. Z은 일반적으로 Z + 1과 동일한 값을 가지지 않으므로 is은 실패합니다. Z2이라는 새 변수를 만들고 Z2 is Z + 1을 사용한 다음 관련 위치에 Z 대신 Z2을 사용해야합니다.

코드를 촬영하고 만들기 수정 :

findThree(_,_,3). % This should allow anything as the first element 

findThree([H|T], M, Z) :- 
    select(H, M, C), Z2 is Z + 1, findThree(T, C, Z2). % select includes member implicitly 
findThree([_|T], M, Z) :- 
    findThree(T, M, Z). % Allow this second case since it simplifies the code 
+0

글쎄, 한 항목을 찾으려면 작동하지만 세 항목에 대해서는 실패합니다. – Waffles

+0

일반적으로 Prolog에 if-then-else 절을 ​​쓰지 않고 단지 역 추적 만합니다. M 값의'N' 복사본을 찾고 싶습니다. 맞습니까? 나는 당신의 질문 설명에서 꽤 말할 수 없었다. –

+0

글쎄,리스트 A의 얼마나 많은 원소가리스트 B에 있는지 알고 싶습니다.이 경우, B에있는 A에 3 개의 원소가 있는지 알아 내려고합니다. – Waffles

관련 문제