가지고있어
답변 :하지만,
이
member
, 또는
memberchk
하지 마십시오. 대신 테이블을 사용하십시오.
vowel(a).
vowel(e).
vowel(i).
vowel(o).
vowel(u).
그런 다음 어떤 종류의 변수가 있는지 말하지 않습니다. 원자가있는 경우 :
?- sub_atom(Word, 0, 1, _, First), vowel(First).
거의 모든 것을 쉽게 원자로 변환 할 수 있습니다. 예를 들어 here을 참조하십시오.
이 쿼리는 원자의 첫 번째 문자가 모음 인 경우 성공하고 그렇지 않으면 실패합니다.당신이 SWI-프롤로그를 사용하는 경우
nth_letter_vowel(N, Word) :-
sub_atom(Word, N, 1, _, Letter),
vowel(Letter).
, 당신은 또한 사용할 수 있습니다 downcase_atom/2
:
nth_letter_vowel(N, Word) :-
sub_atom(Word, N, 1, _, Letter),
downcase_atom(Letter, Lower_Case),
vowel(Lower_Case).
편집 : 예를 들어,
first_letter_vowel(Word) :-
sub_atom(Word, 0, 1, _, First),
vowel(First).
또는 : 그것을 술어를 만들려면 왜 사실 표가 아닌 member/2
또는 memberchk/2
?
깨끗합니다. 더 많은 메모리가 효율적이고 신속합니다. 그것은 프로그램의 의도를 분명하게 만든다. 그것을하는 것이 선호되는 방법이었습니다 : this page의 밑 부분을보십시오 (그런데, 많은 재미있는 것들을 논의합니다). 그래서 memberchk/2
은 확실히,
?- vowel(r).
false.
?- vowel(i).
true.
?- vowel(V).
V = a ;
V = e ;
V = i ;
V = o ;
V = u.
?- vowel(foobar(baz)). % or anything, really
false.
이제 우리는 member/2
가 선택 포인트 뒤에 떠날 것이라는 것을 알고 여기에
있습니다 그것이 사실 테이블로 정의된다 vowel/1
와 가능한 쿼리의 완전한 목록입니다 (우리가 선택 사항을 사용하지 않는다면!). 그러나 그렇다하더라도 :
는
?- memberchk(a, [a,b,c]).
true. % that's fine
?- memberchk(x, [a,b,c]).
false. % ok
?- memberchk(a, L).
L = [a|_G1190]. % what?
?- memberchk(X, [a,b,c]).
X = a. % what?
는 그래서 그래, 원래의 질문의 맥락에서, 우리는주의 깊게 member/2
또는 memberchk/2
에 인수를 확인해야합니다 가정은, 그 이유는 사실의 표는 실제 "단지 문체하고 있습니다 선호하는 "(메모리 효율성, 속도).
실제로 리소스가 부족하지 않습니다. 매우 유용한 온라인 자습서 및 서적 (http://stackoverflow.com/tags/prolog/info)에 대한 태그 정보를 확인하십시오. –