2014-12-30 1 views
2

저는 프로 시저 프로그래밍 언어에 익숙하며 프롤로그에 어려움을 겪고 있습니다. 온라인 자료가 부족한 점도 실망 스럽습니다.첫 글자가 프롤로그 인 경우 알아보기

주어진 변수의 첫 번째 문자를 가져 와서 모음인지 확인하는 가장 '프롤로그'- y 방법은 무엇입니까?

이와 비슷한 것이 내가 생각한 것입니까? 이것은 모두 의사 코드입니다. 그러나 당신이 그것을 어떻게 풀 수 있을까요? 너무 많은

isVowel(Word) :-  
    vowels = [a, e, i, o, u], 
    firstLetter(Word[0]), 
    (
     firstLetter in vowels -> 
      Vowel! 
     ; Not a vowel! 
    ). 

감사합니다, 프롤로그에서

올리

+1

실제로 리소스가 부족하지 않습니다. 매우 유용한 온라인 자습서 및 서적 (http://stackoverflow.com/tags/prolog/info)에 대한 태그 정보를 확인하십시오. –

답변

3

당신은 술어에 대한 명확한 조항 (규칙)을 작성합니다. 술어는 논리적 관계를 설명합니다. 예를 들어 주어진 인수가 모음 인 경우 술어 is_vowel/1이 참일 수 있습니다.

is_vowel(Letter):- 
    member(Letter, "aeiouAEIOU"). 

단어는 첫 글자 가지고 가야 모음으로 시작하는지 확인하기 위해 :

starts_with_vowel([FirstLetter|_]):- 
    is_vowel(FirstLetter). 
:이처럼 동시에 일치 통일 패턴을 할 수있는 지금

starts_with_vowel(Word):- 
    Word = [First|_], 
    is_vowel(First). 

몇 가지 검색어 예 :

?- starts_with_vowel("Italy"). 
true ; 
false. 

?- starts_with_vowel("Vietnam"). 
false. 

?- Letters = [_|"pple"], starts_with_vowel(Letters), string_to_atom(Letters, Word). 
Letters = [97, 112, 112, 108, 101], 
Word = apple ; 
Letters = [101, 112, 112, 108, 101], 
Word = epple ; 
Letters = [105, 112, 112, 108, 101], 
Word = ipple ... 
+0

나의 늦은 반응에 대해 죄송합니다. 저를 도울 수있는 시간을내어 주셔서 감사합니다. 정확히 내가 무엇을했는지, – Ollie

0

이것은 여러 가지 방법으로 수행 할 수 있습니다. 이 특정 솔루션에서는 Definite Clause Grammar (DCG)를 사용합니다.

또한 대답은 "단어"가 무엇인지에 달려 있습니다. 이 문자 코드의 목록 인 경우, 다음이 충분 사용의

starts_with_vowel --> vowel, dcg_end. 
vowel --> [X], {memberchk(X, [0'a,0'A,0'e,0'E,0'i,0'I,0'o,0'O,0'u,0'U])}. 
dcg_end(_, []). 

예 :

?- phrase(starts_with_vowel, `answer`). 
true. 
?- phrase(starts_with_vowel, `question`). 
false. 

PS : 여기에 역 인용 부호의 사용이 SWI7 특정 것을 알 수있다. 다른 프롤로그에서는 코드 목록이 큰 따옴표 안에 표시됩니다.

단어가 다른 것이면 먼저 코드로 변환해야합니다. 예 : 단어가 원자로 표시되는 경우 atom_codes(answer, Codes)

+3

DCG는 Definite Clause 문법의 약자라고 생각했습니다. – CapelliC

+0

@CapelliC 죄송합니다! 오타를 알아 줘서 고마워. –

0
가지고있어

답변 :하지만,

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에 인수를 확인해야합니다 가정은, 그 이유는 사실의 표는 실제 "단지 문체하고 있습니다 선호하는 "(메모리 효율성, 속도).

+0

''member/2' 또는'memberchk/2' (목표를 만족시키는 데 필요한 추론의 수의 작은 차이 제외)를 사용하는 것보다'모음/1'의 직접적인 표현을 사용하면 어떤 이점이 있습니까? –

+0

@ TudorBerariu 긴 주제입니다. 내 원래 대답 편집을 참조하십시오. –

관련 문제