2015-10-18 70 views
3

我對Prolog非常陌生,我很努力去理解我做錯了什麼。我試圖以一個關鍵字的形式獲取用戶輸入,然後顯示它是哪個類的全部細節。 我的代碼將顯示信息,如果我以這種格式course(managing, A, B, C, D, E)查詢,但不會工作,當我試圖簡化它。請求事實的顯示元素

是否有人可以告訴我應該如何編輯我的代碼,以便在顯示與該課程有關的所有信息之前,它會問我想要什麼課程信息,並只需要一個單詞答案?

course(
    accouting, 
    acc10707, 
    day(tuesday), 
    time(1100, 1250), 
    prof(ayesha, mujib), 
    b228 
). 
course(
    managing, 
    mng10247, 
    day(thursday), 
    time(1000, 1150), 
    prof(brian, morris), 
    b228 
). 
course(
    communication, 
    com00207, 
    day(monday), 
    time(1000, 1250), 
    prof(ali, bec), 
    b727 
). 

details :- 
    write('Please enter unit keyword.'), 
    nl, 
    read(Name), 
    course(Name,Code,Day,Time,Prof,Room), 
    write(Name,Code,Day,Time,Prof,Room). 

回答

2

使用你給我收到以下錯誤與1.4.4版本代碼:

| ?- details. 
Please enter unit keyword. 
communication. 
uncaught exception: error(existence_error(procedure,write/6),details/0) 

什麼問題?

  • details/0的最後一個目標是write(Name,Code,Day,Time,Prof,Room)

  • 您無意中嘗試使用write/6,這不存在。

解決方案?

  1. 使用而不是details/0執行的副作用!

    讓我們定義details_of/2。它的第一個參數是一個結構c/6

     
    details_of(Details,Course_name) :- 
        Details = c(Course_name,Code,Day,Time,Prof,Room), 
        course(Course_name,Code,Day,Time,Prof,Room). 
    

    使用示例:

     
    | ?- details_of(X,communication). 
    
    X = c(communication,com00207,day(monday),time(1000,1250),prof(ali,bec),b727) 
    
    yes 
    
  2. 快速修復:而不是write/6使用write/1和結構c/6

    替換write(Name,Code,Day,Time,Prof,Room)通過 write(c(Name,Code,Day,Time,Prof,Room))

     
    | ?- details. 
    Please enter unit keyword. 
    communication. 
    c(communication,com00207,day(monday),time(1000,1250),prof(ali,bec),b727) 
    
    yes