가 나는 질문에 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).
나는 메타 술어에 관해서도 의견을 남겼다. 'nonvar/1'은 그들 중 하나이며 순수한 술어 ('=/2'와'member/2'와 같은)와 그것들을 혼용하지 않고 그러한 술어를 정의하는 동안 괜찮습니다.하지만 원래의 질문에는 addUnique ([0,0,3], 3)'(0은 두 번 언급 했음)를 포화시킬 수있는'addUnique/2 '가 있었지만,'addUnique/2' ([A, B, C], 3)'. – ony
[안전한 테스트] (https://stackoverflow.com/q/27306453/772868)가 어떻게 가능한지보십시오. 또 다른 방법은 ['iwhen/2'] (https://stackoverflow.com/a/40449516/772868)를 사용하는 것입니다. – false