我想在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
。
它不应该显示这个。
有人能解释我为什么吗?
答案 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不会回溯则消除了选择点。