2014-12-03 49 views
3

我有我的代碼在序言中的這個問題。如何在prolog中控制用戶輸入?

這是關於時尚造型師專家系統,從用戶的屬性,並給她指定的外觀。

下面是代碼:

main_level(2):- 
    write('Please enter weight (60s (1), 50s (2)): '), read(W), 
    write('Please enter tall (more than 160 (1), less than 160 (2)): '), read(T), 
    write('Please enter skin color (bronze (1), white (2), black (3)): '), read(S1), 
    write('Please enter hair length (medium (1), short (2), long (3)): '), read(H1), 
    write('Please enter hair color (brown (1), black (2), blond (3)): '), read(H2), 
    write('Please enter event (wedding (1), fami party (2): '), read(E), 

但我怎麼能強制用戶輸入正確的答案,所以程序將無法完成,直到用戶輸入正確的答案?

我試圖通過使用遞歸規則,但它也沒有工作!

+0

我修改了我的答案以顯示錯誤消息,您可以檢查這種方法是否有效! – Ahmad 2014-12-04 14:37:24

回答

1

基本上,你可以驗證每個輸入與此模式:

main_level(2):- 
    repeat, write('Please enter weight (60s (1), 50s (2)): '), read(W), (W == 1 ; W == 2), 
    repeat, write('Please enter tall (more than 160 (1), less than 160 (2)): '), read(T), (T == 1 ; T == 2), 
... 

,但我會建議,而不是編寫一個簡單的菜單,像

menu(Header, Choices, Choice) :- 
    repeat, 
    write(Header), 
    forall(nth1(I,Choices,Value), format('~w (~d) ', [Value,I])), 
    read(C), 
    nth1(C, Choices, _). % validate index input 

main_level(2):- 
    menu('Please enter weight ',['60s','50s'], W), 
    menu('Please enter tall ',['more than 160','less than 160'], T), 
    ... 
叫它
+0

這是非常有益的,謝謝 – 2014-12-08 10:30:50

1

您可以測試答案是否等於預期值,如果不是規則失敗,則可以使用在此檢查後剪下(!)以顯示錯誤消息,如下所示。

main_level(2):- 
write('Please enter weight (60s (1), 50s (2)): '), 
read(W), (W == 1; W == 2),!,... 

main_level(2):- write('Please enter a value according to the menu').