好的,我得到了这两个谓词hangman
和graphics
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
放在评论中hangman
,我的程序运行正常。
答案 0 :(得分:3)
(这个答案实际上并不是关于这个问题的答案,所以请回答@SeçkinSavaşçı谁回答这个问题做得很好,更多的是代码审查)
在这里,您明显想要测试列表是否为空并通过显示某些内容做出相应的反应。对于测试,如果列表是空的部分,那你做错了:
graphics(FailedList):-
length(FailedList, L),
L == 0,
% some IO stuff
在prolog中,您可以更直接地使用统一:
graphics(FailedList):-
length(FailedList, 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/\\').
主要谓词似乎也存在一些问题,但如果你被困在某个地方,我会让你调查并提出问题:)
答案 1 :(得分:2)
write('/\'), nl.
在最后一行中,您使用\'
转义结尾引号。将其更改为:
write('/\\'), nl.
顺便说一下:@Mog在我看了评论之前写了答案,我测试了它,现在它找到了图形/ 1.