2016-11-04 26 views
0

我想檢查用戶輸入的句子中的單詞是否與列表中的至少一個字符串匹配。這是我的。當我輸入例如'香蕉車'(它應該)時,我的謂詞測試返回false。如何檢查用戶推測字符串是否與列表中的字符串匹配?

在swish prolog中,我編寫了enterQuery。當提示我寫'香蕉車'時。我回來[香蕉,車] [香蕉,蘋果]假

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). 

當我查詢:

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

相反,我想到:

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

看起來好像沒什麼問題。你需要展示你的實際互動,僅僅說「返回假」是不夠的。 – 2016-11-04 12:13:16

+0

@Boris行。在解釋器(swish prolog)中我寫道:enterQuery。當提示我輸入「香蕉車」時。我得到的輸出是[香蕉,汽車] [香蕉,蘋果]虛假謝謝! – JCR

+1

不,不夠好,你應該把實際的交互式提示內容複製粘貼到問題中。 – 2016-11-04 12:28:24

回答

2

你做了很多的您展示的代碼中不必要的東西。

這是我怎麼會直接從頂層做到這一點:

?- 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

謝謝@Boris。用[「香蕉」,「蘋果」]取代[香蕉,蘋果]做到了。 – JCR

+0

我使用寫法是因爲我想模擬用戶輸入任何句子的情況,每個單詞應該與標準單詞列表相匹配。 – JCR

+0

@JCR我試圖做的一點是,頂層爲您提供完全免費的術語讀寫:幾乎總是沒有必要在頂層頂部添加您自己的半成品交互式提示,也就是說, ,以及交互式提示_和_一個REPL。 – 2016-11-04 12:55:10

1

當面對(大量的)文本解析,在SWI-Prolog的你可以試試內置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

這是一個非常好的謂詞,之前沒有看過,所以非常感謝您的展示! – 2016-11-04 13:00:30

+1

'' - tokenize_atom('代理007 do 0815',L).'''' 'L = ['Agent',7,do,815] .' – false

相關問題