未捕获的异常:error(instantiation_error,(is)/2)



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

未捕获的异常:error(instantiation_error,(is(/2(

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

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.

这一行就是问题所在:

validazione_lista([], _).

它没有说明空列表是有效还是无效,而是让空列表尚未决定。现在代码

(validazione_lista(CODA, C), A is C)

具有未知的A和未知的C并且执行给出错误的CCD_ 1。将其更改为

validazione_lista([], 1).

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


NB。在Prolog变量中编码所有的真/假信息,并在不需要if/else的情况下编写自己的信息,这使得代码更难遵循。例如

validazione_lettera(Lettera, A) :-
Lettera == 32,
A is 1,
!.

"如果一个字母是一个空格并且a是1〃,则该字母是有效的;可以写:

validazione_lettera(Lettera) :-
Lettera == 32,
!.

"如果一个字母是一个空格,则该字母是有效的;。简化为:

validazione_lettera(32).

"32是一个有效的字母代码";。你不需要;如果"其他代码无效";,默认情况下会发生这种情况。

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

validazione_lista([]).
validazione_lista([TESTA|CODA]) :-
validazione_lettera(TESTA),
validazione_lista(CODA).

然后可以完全删除if_validazione。您可以直接进行主回路测试:

(   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).

相关内容

最新更新