SWI-Prolog中未定义的过程

时间:2012-05-29 12:39:21

标签: prolog

好的,我得到了这两个谓词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,我的程序运行正常。

2 个答案:

答案 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.