Ошибка типа: ожидается символьный код с прологом
Я новичок в прологе. Я писал код с проблемой Гольдбаха, в котором я должен перечислить все возможные группы по одному четному числу. Я нашел такой код:
is_prime(2).
is_prime(3).
is_prime(P) :- integer(P), P > 3, P mod 2 =\= 0, \+ has_factor(P,3).
has_factor(N,L) :- N mod L =:= 0.
has_factor(N,L) :- L * L < N, L2 is L + 2, has_factor(N,L2).
goldbach(4,[2,2]) :- !.
goldbach(N,L) :-
N mod 2 =:= 0,
N > 4,
goldbach(N,L,3).
goldbach(N,[P,Q],P) :-
Q is N - P,
is_prime(Q), P < Q.
goldbach(N,L,P) :-
P < N,
next_prime(P,P1),
goldbach(N,L,P1).
next_prime(P,P1) :- P1 is P + 2, is_prime(P1), !.
next_prime(P,P1) :- P2 is P + 2, next_prime(P2,P1).
Однако, когда я выполняю программу, программа успешно печатает первую группу, но затем выдает ошибку.
1 ?- goldbach(28, L).
L = [5, 23]
ERROR: Type error: `character_code' expected, found `-1' (an integer)
ERROR: In:
ERROR: [11] char_code(_4206,-1)
ERROR: [10] '$in_reply'(-1,'?h') at c:/program files/swipl/boot/init.pl:779
Я не знаю, как происходит эта ошибка, и я ищу информацию в Интернете, но ничего не получаю. У кого-нибудь есть идеи? Спасибо за ваш ответ.
1 ответ
После того, как Prolog напечатает первый ответ, он ожидает вашего ввода, чтобы сообщить, заинтересованы ли вы в дополнительных ответах. В первом приближении действительными клавишами являются : (точка с запятой) или пробел или n, если вы хотите больше ответов, или . (точка) или Enter или y, если вас больше не интересуют ответы.
Похоже, вы используете какую-то другую, неожиданную комбинацию клавиш. Если вы пытаетесь печатать ; но на вашей клавиатуре нет ни одной клавиши, попробуйте вместо нее пробел или n.
Я могу успешно получить несколько ответов из кода, который вы разместили, нажав ; после каждого ответа:
?- goldbach(28, L).
L = [5, 23] ;
L = [11, 17] ;
false.
Изменить: Как вы находитесь в Windows, ответ от После первого ответа, Пролог показывает ошибку "char_code/2: не удается представить из-за" код_символа "" для использования swipl-win.exe
вместо swipl.exe
также может быть полезным.