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放在hangman注释中,我的程序就可以正常工作。

4

2 回答 2

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/\\').

主要谓词似乎也有一些问题,但是如果您卡在某个地方,我会让您研究一下并提出问题:)

于 2012-05-30T09:13:51.317 回答
2
 write('/\'), nl.

在最后一行中,您使用 . 转义结束引号\'。将其更改为:

 write('/\\'), nl.

顺便说一句:@Mog 在我查看评论之前已经写了答案,我对其进行了测试,现在它找到了 graphics/1。

于 2012-05-29T18:41:45.720 回答