Prolog中基本规则的问题

时间:2018-05-14 07:39:58

标签: prolog

我想在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').

当我在翻译中写这个时:

  

compromis_1(tddv_estime(19),tddv_worst(16),etendue_gisement_courant(2),etendu e_gisement_max(8),etendue_gisement_min(1))。

显示C unchanging

它不应该显示这个。

有人能解释我为什么吗?

1 个答案:

答案 0 :(得分:1)

您的实施并不等同于您展示的C版本。

这是您当前的代码:

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

Prolog认为这是一系列由逻辑分离相关的四个子句(OR - ;)。如果第一个->表达式失败,则会调用下一个析取表达式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')

原始伪代码的Prolog等价物是:

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

在Prolog中,这种行为恰好像伪代码一样工作,因为->如果成功并且Prolog不会回溯则消除了选择点。