0

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

未捕获的异常:错误(实例化错误,(是)/ 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.
4

1 回答 1

1

这条线是问题所在:

validazione_lista([], _).

它没有说一个空列表是有效还是无效,它让一个空列表不确定。现在代码

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

有一个未知的 A 和未知的 C 并且确实_ is _给出了错误。将其更改为

validazione_lista([], 1).

所以一个空列表是有效的输入,并且代码有效。


注意。在 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).

于 2022-01-16T21:25:52.770 回答