2010-06-10 2 views
4

가 나는 질문에 this solution을 기록하지만 ony는 말을 나에게 글을 남겼습니다 : "변수는"기타 "변수"에 대한 권리 통일화를 도출 전략을 변경해야 바운드 이미 무료 또는 경우Prolog 모범 사례 : 변수가 이미 바인딩되어 있는지 확인하십시오.

술어가 확인 을 (즉, 속도를 높이거나 을 유도 할 수 있습니다). 동적 인 경우에도 마찬가지입니다. 술어 - 속도 향상에 사용할 수 있지만 을 동작 변경 트리거로 사용해서는 안됩니다.

나는 이것이 왜 궁금합니다. 무엇인가가 이미 다른 것에 정의되어 있는지 확인하는 것은 나쁜 습관입니까? 나쁜 습관이라고 생각합니까? '더 나은 실천'이 될 수있는 다른 옵션이 있습니까? 등

% ================================ 
% Ensures that all variables are unique. 
% ================================ 

% Base case: Assigned variables unique values 
used([], Nin, Nin). 

% Have already assigned a value to this variable 
used([A|B], Nin, Nout) :- 
     integer(A), % <----------------- THIS IS THE LINE IN QUESTION 
     helper(B,Nin,Nout). 

% Have not assigned a value to this variable yet 
% Assign it and remove it from the list. 
used([A|B] , Nin, Nout) :- 
     member(A,Nin), 
     delete(Nin,A,Temp), 
     helper(B,Temp,Nout). 
+0

나는 메타 술어에 관해서도 의견을 남겼다. 'nonvar/1'은 그들 중 하나이며 순수한 술어 ('=/2'와'member/2'와 같은)와 그것들을 혼용하지 않고 그러한 술어를 정의하는 동안 괜찮습니다.하지만 원래의 질문에는 addUnique ([0,0,3], 3)'(0은 두 번 언급 했음)를 포화시킬 수있는'addUnique/2 '가 있었지만,'addUnique/2' ([A, B, C], 3)'. – ony

+0

[안전한 테스트] (https://stackoverflow.com/q/27306453/772868)가 어떻게 가능한지보십시오. 또 다른 방법은 ['iwhen/2'] (https://stackoverflow.com/a/40449516/772868)를 사용하는 것입니다. – false

답변

8

integer/1 같은 조건의 근본적인 문제, atom/1들이 하지   단조을 있다는 것입니다 :

여기 내 솔루션이었다.

예를 들어 ?- integer(5).이면 성공합니다. 그러나 더 일반적인 목표, ?- integer(X)., 에 실패합니다!

선언적 디버깅과 자동 생성 된 설명을 위해 목표가 성공할 경우 해당 목표의 모든 일반화가 실패하지 않아야합니다. (당신은 선언적 의미가 좋은 단순 술어를 원하는 경우 즉,)

은 "적절한"integer/1에 대한 것 할 것은 인스턴스를 제기하는 것이 충분하지 않음을 이유로 ?- integer(X). 같은 쿼리에   오류 이 때 질문에 대한 답변 정보. 대신 integer/1, 당신은이 소리 동작을 얻기 위해 library(error)에서 must_be/2를 사용해야합니다

?- must_be(integer, X). 
ERROR: Arguments are not sufficiently instantiated 

must_be/2 일반 멋진 속성 인 단조 동작합니다.

오닉스의 의견을 확장하십시오. 문제는 (적어도 위의 샘플 결과가 맞으면) 이제 목표가 교환 적이기 때문에 더 이상 진정한 관계가 아닙니다. 단순히 목표의 순서를 바꾸는 것이 성공하지 못합니다. ?- X = Y, addUnique([X,Y,3], 3), X = 0.이 실패하기 때문에 동일한 결과가 산출됩니다.

이러한 현상은 메타 논리적 술어를 사용하는 일반적인 결과입니다. 이러한 문제에 대한 선언적 해결책은 제약입니다. 예를 들어 을 참조하십시오. 그들은 단조롭고 교환 가능하며 일반적으로 훨씬 이해하기 쉽습니다.

관련 문제