我正在做一个程序来识别字符串中是否只有字母和空格,但是它给了我一个错误,我无法解决它。
非正常异常:错误(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.发布于 2022-01-16 21:25:52
这一行是问题所在:
validazione_lista([], _).它并不是说空列表是有效的还是无效的,而是让空列表未定。现在代码
(validazione_lista(CODA, C), A is C)有一个未知的A和未知的C,并做_ is _,这就产生了错误。把它改成
validazione_lista([], 1).因此,空列表是有效的输入,并且代码可以工作。
注意:对Prolog变量中的所有真相/错误信息进行编码,并编写您自己的if/ and不需要,这会使代码更难理解。例如:
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).。
https://stackoverflow.com/questions/70732693
复制相似问题