2013-04-04 55 views
0

我正在嘗試使用swi-prolog編寫一個程序,它隨機詢問人們的名字或姓氏,並根據他們輸入的內容打印「正確」或「不正確」。當前的正確答案是「你好」和「世界」,但不管用戶輸入什麼內容,輸出都是錯誤的,並且不會打印正確/不正確的答案。swi-prolog中的字符串比較程序總是失敗

start:-(Q=['What is your first name?','What is your last name?'], 
    random_member(N,[0,1]), 
    nth0(N,Q,X), 
    writeln(X)), 
    readln(S), 
    check_answer(N,S). 


check_answer(N,S):-A=['Hello','World'], 
    nth0(N,A,X), 
    writeln(X), 
    ([email protected]=X)->writeln('correct'), 
    not([email protected]=X)->writeln('incorrect'). 

我後來它編輯成:

start:-(Q=['What is your first name?','What is your last name?'], 
random_member(N,[0,1]), 
nth0(N,Q,X), 
writeln(X)), 
read(S), 
check_answer(N,S). 


check_answer(N,S):-A=['Hello','World'], 
     nth0(N,A,X), 
     writeln(X), 
     writeln(S), 
     (([email protected]=X))->writeln('correct') ; writeln('incorrect'). 

回答

1

我能發現代碼中的兩個問題。

一個)readln/1(無證)返回的項目的列表(然後偷看第一項或使用讀/ 1​​):

?- readln(X). 
|: Hello. 
X = ['Hello', '.']. 

?- readln(X). 
|: Hello 
X = ['Hello']. 

?- readln(X). 
|: Hello . 
X = ['Hello', '.']. 

b)在對如果然後其他操作者( - >)將永遠失敗,因爲你在兩者上都省略了else分支,條件是獨佔的。嘗試

... 
(([email protected]=X)->writeln('correct') ; writeln('incorrect')). 

編輯有2個問題。我錯誤地建議閱讀/ 1。如果我們編寫變量,即UppercaseStartingSymbol,則讀取Prolog術語,然後讀取變量。我的錯。 readln似乎沒問題,但改變模式選擇第一項。

另一個問題,與你無關:你在 - >'語句'中錯誤放置了括號。

下面的代碼:

start:-(Q=['What is your first name?','What is your last name?'], 
random_member(N,[0,1]), 
nth0(N,Q,X), 
writeln(X)), 
readln(S), 
check_answer(N,S). 

check_answer(N,[S|_]):-A=['Hello','World'], 
     nth0(N,A,X), 
     writeln(X), 
     writeln(S), 
     (([email protected]=X)->writeln('correct') ; writeln('incorrect')). 
+0

感謝。我已經做出了您建議的更改,並且在比較之前添加了Writeln(S)語句。無論我輸入什麼,它都會打印出_L143。你能解釋一下發生了什麼以及如何解決它?根據之前的編程經驗,我猜想_L143是存儲字符串的內存位置。是否有我應該做的解引用的序言版本? – 2013-04-04 05:30:39

+0

_L143似乎意味着'未被證實的變量'。沒有細節就很難測試。你可以編輯你的問題,添加最新的代碼? – CapelliC 2013-04-04 05:58:14

+0

主啊,主說:「成就了。」 – 2013-04-04 06:01:04