Проблемы с основными правилами в Прологе - PullRequest
0 голосов
/ 14 мая 2018

Я хочу перевести свой естественный код в prolog.

Вот мой натуральный код:

if E < W then
   if C < Max then
      print('increment C')
   else
      print('C unchanging')
if E > W then
   if C > Min then
      print('decrement C')
   else
      print('error')

Вот мой код в SWI-Prolog:

tddv_worst(_).
tddv_best(_).
tddv_courant(_).
tddv_estime(_).
etendue_gisement_courant(_).
etendue_gisement_min(_).
etendue_gisement_max(_).

compromis_1(tddv_estime(E),tddv_worst(W),etendue_gisement_courant(C),etendue_gisement_min(Min),etendue_gisement_max(Max)) :-
(E < W , C < Max) -> writeln('Increment C') ; writeln('C unchanging') ;
(E > W , C > Min) -> writeln('Decrement C') ; writeln('Error').

Когда я пишу это в переводчике:

компромисс_1 (tddv_estime (19), tddv_worst (16), etendue_gisement_courant (2), etendu e_gisement_max (8), etendue_gisement_min (1)).

Отображает C unchanging.

Это не должно отображать это.

Может кто-нибудь объяснить мне, почему?

1 Ответ

0 голосов
/ 14 мая 2018

Ваша реализация на самом деле не эквивалентна версии C, которую вы показываете.

Вот ваш текущий код:

(E < W , C < Max) -> writeln('Increment C') ;
writeln('C unchanging') ;
(E > W , C > Min) -> writeln('Decrement C') ;
writeln('Error').

Пролог рассматривает это как серию из четырех предложений, связанных логической дизъюнкцией (ИЛИ - ;). Если первое -> выражение терпит неудачу, оно вызывает следующее дизъюнктивное выражение writeln('C unchanging'). Приведенный выше код примерно эквивалентен:

if E < W and C < Max then
   print('increment C')
else
   print('C unchanging')

if E > W and C > Min then
   print('decrement C')
else
   print('error')

Пролог, эквивалентный вашему исходному псевдокоду:

(   E < W
->  (   C < Max
    ->  writeln('increment C')
    ;   writeln('C unchanging')
    )
) ;
(   E > W
->  (   C > Min
    ->  writeln('decrement C')
    ;   writeln('Error')
    )
)

В Прологе такое поведение работает как псевдокод, так как -> исключает точку выбора, если она успешна, и Пролог не будет возвращаться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...