2016-11-04 2 views
0

사용자가 입력 한 문장의 단어가 적어도 하나의 문자열과 일치하는지 확인하고 싶습니다. 여기에 내가 가진 것이있다. 예를 들어 'banana car'(예 : 'should not')를 입력하면 내 조건부 테스트가 false를 반환합니다.사용자가 입력 한 문자열이 목록의 문자열과 일치하는지 여부를 어떻게 확인할 수 있습니까?

swish prolog에서 나는 enterQuery라고 씁니다. 프롬프트되면 나는 '바나나 카'라고 적는다.

?- enterQuery. 
|: 'banana car'. 
[banana,car][banana,apple] 
false. 

는 대신, 예상 :

?- enterQuery. 
|: 'banana car'. 
[banana,car][banana,apple]successs 
+0

나에게 잘 보이는.실제 상호 작용을 보여줄 필요가 있습니다. 단지 "거짓을 반환합니다"라고 말하는 것만으로는 충분하지 않습니다. –

+0

@ 보리스 OK. 통역사 (swish prolog)에서 나는 다음과 같이 씁니다 : enterQuery. 프롬프트되면 나는 'banana car'라고 입력합니다. 내가 얻는 결과는 [바나나, 자동차] [바나나, 사과] 거짓 고마워! – JCR

+1

아니요, 불만족 스럽습니다. 실제로 대화 형 음성 안내 내용을 질문에 복사하여 붙여 넣기 만하면됩니다. –

답변

2

당신은 많은 일을 내가 쿼리 할 때

enterQuery:- 
read(X), 
processQuery(X). 

processQuery(X):- 
split_string(X," ", " ", L), 
write(L), 
test(L). 

test(L):- 
write([banana, apple]), 
common_member(L,[banana,apple]), 
write('successs'). 

common_member(Xs,Ys) :- 
member(E,Xs), 
member(E,Ys). 

거짓 [바나나, 차] [바나나, 사과] 돌아 오기 당신이 보여주는 코드에서 불필요한 것들. 여기

내가 최상위 레벨에서 직접이 작업을 수행 할 방법은 다음과 같습니다

?- L = [banana, car], member(E, L), member(E, [banana, apple]). 
L = [banana, car], 
E = banana . 

은 현재의 약자로 문제는 코드가 string을 기대하고있다,하지만 당신은 그것을 원자를주는 것입니다. 귀하의 코드 :

?- enterQuery. 
|: "banana car". 
[banana,car][banana,apple] 
false. 

큰 따옴표에 유의하십시오.

여전히 문제가 있습니다 : 이제, 첫 번째 목록에서 bananacarstring을하고, 두 번째 목록에서 bananaapple 원자이다.

또는 입증하기 :
?- read(X), string(X). 
|: banana. 

false. 

?- read(X), string(X). 
|: "banana". 

X = "banana". 

그래서 당신은 또한 당신이 [banana, apple]에서 ["banana", "apple"]에 비교하는 목록을 만들 필요가있다.

여전히 매우 지저분한 코드이므로이 대답의 맨 위에있는 첫 번째 코드 단편에 입력하는 대신 read/1으로 읽으려는 이유가 명확하지 않습니다.

편집 :

당신은 최상위 수준에서 문장을 입력해야하는 경우, 아무것도 (문자열을), (원자에 대한) 작은 따옴표 큰 따옴표를 포장, 여전히으로 입력에서 당신을 중지하지 은 술어에 대한 인수가입니다! 이로드와

string_words(S, Ws) :- 
     separators_string(Seps), 
     split_string(S, Seps, Seps, Ws). 

separators_string(Seps) :- 
     findall(C, 
       (char_type(C, white) 
       ; char_type(C, punct) 
       ), 
       Cs), 
     string_chars(Cs, Seps). 

: 여기

몇 가지 예제 코드입니다

?- string_words("banana car", Ws). 
Ws = ["banana", "car"]. 

?- string_words("Hello, how are you doing?", Ws). 
Ws = ["Hello", "how", "are", "you", "doing"]. 
+0

감사합니다. @ 보리스. [바나나, 사과]를 [바나나], [사과]로 대체하면 그랬습니다. – JCR

+0

나는 사용자가 어떤 문장을 입력하는 상황을 에뮬레이트하기를 원하기 때문에 쓰기를 사용한다. 여기서 각 단어는 기준 단어 목록과 일치해야한다. – JCR

+0

@JCR 내가하고자하는 요점은 최상위 레벨이 당신에게 무료로 장기 독서와 글쓰기를 제공한다는 것입니다. 최상위 레벨 위에 자신 만의 대화식 프롬프트를 추가하는 것은 거의 항상 불필요합니다. 대화 형 프롬프트 _ 및 REPL을 표시합니다. –

1

SWI - 프롤로그에서 (많은) 텍스트 분석에 직면 할 때 당신이 시도 할 수있는 내장 tokenize_atom/2. 이름에도 불구하고, 실제로는 다른 텍스트 표현과 함께 작업 할 수 있습니다

?- tokenize_atom('apple banana', L). 
L = [apple, banana]. 

?- tokenize_atom("apple banana", L). 
L = [apple, banana]. 

?- tokenize_atom(`apple banana`, L). 
L = [apple, banana]. 

보리스는 이미 다른 세부 사항을 해결 ...

+0

제안 해 주셔서 감사합니다! – JCR

+0

이것은 정말 좋은 술어입니다. 전에 보지 못했지만 그것을 보여 주셔서 감사합니다! –

+1

'? - tokenize_atom ('Agent 007 do 0815', L). 대답은 입니다. L = [ 'Agent', 7, do, 815] .' – false

관련 문제