2012-05-29 64 views
3

好吧,我得到了這兩個前提hangmangraphics
未定義程序

fail([]). 

hangman:- 
    getPhrase(Ans), 
    !, 
    write('Welcome to hangman.'), 
    nl, 
    fail(FailedList), 
    graphics(FailedList), %<--- The call is made here. 
    name(Ans,AnsList), 
    makeBlanks(AnsList, BlankList), 
    getGuess(AnsList,BlankList, FailedList). 


graphics(FailedList):- 
    length(FailedList, L), 
    L == 0, 
    write('-----------'), nl, 
    write('|'), nl, 
    write('|'), nl, 
    write('|'), nl, 
    write('|'), nl, 
    write('|'), nl, 
    write('|'), nl, 
    write('|'), nl, 
    write('|'), nl, 
    write('/\'), nl. 

爲什麼我得到的錯誤:ERROR: hangman/0: Undefined procedure: graphics/1
請注意,如果我將graphics中的謂詞置於註釋中,我的程序可以正常工作。

+2

你忘記了''''''''''''語句中的''''。 – m09

+0

@Mog感謝您的幫助,但我仍然得到錯誤。任何想法爲什麼它不承認它? – Kostas

+0

@Mog你有答案的信貸,隊友! –

回答

2
write('/\'), nl. 

在最後一行中,你與\'逃離結束引號。將其更改爲:

write('/\\'), nl. 

BTW:@Mog寫答案之前,我有看評論,我測試了它,現在它找到的圖形/ 1。

+0

謝謝!非常感激! – Kostas

3

(這個答案是不是真正的要求,所以請讓答案@SeçkinSavaşçı誰做了偉大的工作,回答這個問題的問題,它更是一個代碼審查)

在這裏,你明顯希望測試列表是空的,並通過顯示一些事情做出相應的反應。對於測試,如果列表是空的部分,你做錯了它:

graphics(FailedList):- 
    length(FailedList, 0), 
    % some IO stuff 

,或者更好,在這裏你:

graphics(FailedList):- 
    length(FailedList, L), 
    L == 0, 
    % some IO stuff 

在序言中,你可以在一個更直接的方式使用統一在頭直接測試的空列表作爲條件來執行謂詞的身體:

graphics([]):- 
    % some IO stuff 

對於IO部分,你又做有點不對。 SWI-Prolog的,例如,有一個writeln/1謂詞,這將使你的代碼打火機:

graphics([]):- 
    writeln('-----------'), 
    writeln('|'), 
    writeln('|'), 
    writeln('|'), 
    writeln('|'), 
    writeln('|'), 
    writeln('|'), 
    writeln('|'), 
    writeln('|'), 
    writeln('/\\'). 

仍然較好,format/1謂詞可用於:

graphics([]):- 
    format('-----------~n|~18~n|~n|~n|~n|~n|~n|~n|~n/\\'). 

主謂似乎有一些問題太多了,但我會讓你看看它,並提出問題,如果你被困在某個地方:)

+0

對實現的一般改進的很好的概述。 –