首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >非正常异常:错误(instantiation_error,(is)/2)

非正常异常:错误(instantiation_error,(is)/2)
EN

Stack Overflow用户
提问于 2022-01-16 17:57:58
回答 1查看 203关注 0票数 0

我正在做一个程序来识别字符串中是否只有字母和空格,但是它给了我一个错误,我无法解决它。

非正常异常:错误(instantiation_error,(is)/2)

我认为错误仍然存在于validazione_lista中,但我无法解决。

代码语言:javascript
运行
复制
validazione_input(Input) :-
repeat,
    read(Input),
    validazione_lista(Input, A),
(   A == 0 -> write('\ninput non valido, inserire solamente lettere maiuscole, minuscole e spazi:'), nl, fail
;   A == 1 -> !
).

validazione_lista([], _).
    validazione_lista([TESTA|CODA], A) :-
    validazione_lettera(TESTA, B),
    if_validazione(B, (validazione_lista(CODA, C), A is C), A is B).

validazione_lettera(Lettera, A) :-
    Lettera == 32,
    A is 1,
    !.
validazione_lettera(Lettera, A) :-
    (Lettera >= 65, Lettera =< 90),
    A is 1,
    !.  
validazione_lettera(Lettera, A) :-
    (Lettera >= 97, Lettera =< 122),
    A is 1,
    !.
validazione_lettera(_, A) :-
    A is 0.

if_validazione(C, I1, _) :- C=1, !, I1.
if_validazione(C, _, I2) :- C=0, !, I2.
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-16 21:25:52

这一行是问题所在:

代码语言:javascript
运行
复制
validazione_lista([], _).

它并不是说空列表是有效的还是无效的,而是让空列表未定。现在代码

代码语言:javascript
运行
复制
(validazione_lista(CODA, C), A is C)

有一个未知的A和未知的C,并做_ is _,这就产生了错误。把它改成

代码语言:javascript
运行
复制
validazione_lista([], 1).

因此,空列表是有效的输入,并且代码可以工作。

注意:对Prolog变量中的所有真相/错误信息进行编码,并编写您自己的if/ and不需要,这会使代码更难理解。例如:

代码语言:javascript
运行
复制
validazione_lettera(Lettera, A) :-
    Lettera == 32,
    A is 1,
    !.

“如果信是空格而A是1”,则信是有效的:

代码语言:javascript
运行
复制
validazione_lettera(Lettera) :-
    Lettera == 32,
    !.

“如果信是空格,信是有效的”。这简化为:

代码语言:javascript
运行
复制
validazione_lettera(32).

"32是有效的字母代码“。您不需要“其他代码无效”,这在默认情况下发生。

所有的代码都这样简化。validazione_lista([]).说空列表是有效的。然后,主列表检查简化为“如果第一项有效而其余项有效”,两行简短:

代码语言:javascript
运行
复制
validazione_lista([]).
validazione_lista([TESTA|CODA]) :-
    validazione_lettera(TESTA),
    validazione_lista(CODA).

然后,您可以完全删除if_validazione。您可以直接进行主循环测试:

代码语言:javascript
运行
复制
(   validazione_lista(Input) -> true 
;  write('\ninput non valido, inserire solamente lettere maiuscole, minuscole e spazi:'), nl, fail
).

然后你可以在整个代码中删除A,B,C,删除A是B,A是C。也许还可以使用between(65, 90, Lettera).

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70732693

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档