Ошибка типа: `character_code' ожидается с прологом

Я новичок в прологе. Я писал код с проблемой гипотезы Гольдбаха, в которой я должен перечислить все возможные группы одного четного числа. Я нашел такой код:

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

Я не знаю, как возникает эта ошибка, и я ищу информацию в Интернете, но ничего не получаю. У кого-нибудь есть идеи? Спасибо за ваш ответ.


person BonWaGG    schedule 27.05.2017    source источник
comment
is_prime(P) дает P = 2 ; P = 3, но P = 5, is_prime(P) тоже успешно. Либо поставьте P > 3 первым, либо используйте clpfd!   -  person false    schedule 27.05.2017
comment
goldbach(6,L). не работает. L = [3,3] ожидается!   -  person false    schedule 27.05.2017


Ответы (1)


После того, как Prolog напечатает первый ответ, он ожидает вашего ввода, чтобы сообщить ему, заинтересованы ли вы в дополнительных ответах. В первом приближении действительными клавишами для нажатия являются ; (точка с запятой) или Пробел или n, если вы хотите получить больше ответов, или . (точка) или Введите или y, если вас больше не интересуют ответы.

Похоже, вы используете какую-то другую, неожиданную клавишу или комбинацию клавиш. Если вы пытаетесь ввести ;, но на вашей клавиатуре нет для этого ни одной клавиши, попробуйте вместо этого Пробел или n.

Я могу успешно получить несколько ответов из кода, который вы разместили, нажав ; после каждого ответа:

?- goldbach(28, L).
L = [5, 23] ;
L = [11, 17] ;
false.

Изменить: как и в Windows, ответ от После первого ответа Пролог показывает ошибку char_code/2: Невозможно представить из-за 'character_code' использование swipl-win.exe вместо swipl.exe также может быть полезно.

person Isabelle Newbie    schedule 27.05.2017
comment
Неожиданная комбинация клавиш — конец файла, C-d или что-то еще в Windows. - person false; 27.05.2017
comment
спасибо за помощь. все проблемы решаются. Я действительно новичок в прологе, поэтому я этого не знаю. Могу ли я спросить, если этот код выполнялся в другой ОС, может ли быть все в порядке при использовании swipl.exe? - person BonWaGG; 27.05.2017
comment
Он отлично работает под Linux, используя стандартную программу swipl. Разница между этими программами специфична для Windows. Не беспокойтесь об этом, просто используйте то, что работает для вас. - person Isabelle Newbie; 27.05.2017
comment
Информация @BonWaGG о том, как использовать Prolog в командной строке, находится в документации Prolog. Если вы новичок в Прологе, вам следует прочитать вводный материал в руководстве по Прологу. - person lurker; 27.05.2017
comment
@IsabelleNewbie спасибо за объяснение!! - person BonWaGG; 27.05.2017
comment
@lurker Спасибо, я думаю, я должен понять это как можно скорее. - person BonWaGG; 27.05.2017