Prolog没有传递变量

时间:2016-12-18 18:22:12

标签: prolog

在Prolog规则中,我尝试将变量从案例传递到另一个但是它没有工作

plane(c130,propeller,high,conventional,conventional,under-wing).
plane(c141,jet,high,sweptback,ttail,upperwing).
plane(c5a,jet,high,sweptback,ttail,none).
plane(b747,jet,low,sweptback,conventional,aftcockpit).

planeinfo:-
    plane(Name,Eng,Wing,Shape,Tail,Bulges),
    write(Name),put(10),
    write(Eng),put(10),
    write(Wing),put(10),
    write(Shape),put(10),
    write(Tail),put(10),
    write(Bulges).

getplane:-
    write('enter engine type '),
    read(Eng),
    Eng == 'propeller' ,Name ='c130',
    planeinfo,!;
    write('enter wing postion'),
    read(Wing),
    Wing == 'low' , Name = 'b747',
    planeinfo,!;
    write('enter the bulges type'),
    read(Bulges),
    Bulges == 'upperwing' , Name = 'c141', write(Eng),write(Wing),
    planeinfo,!;
    write('enter wing shape'),
    read(Shape),
    write('enter tail'),
    read(Tail),
    planeinfo,
    write("Plane Is Not Found , Please Retry"),
    repeat.

这是输出

?- getplane.
enter engine type jet.
enter wing postion|: high.
enter the bulges type|: upperwing.
_L155_L156c130

propeller
high
conventional
conventional
under-wing
true.

除了错误的输出。

1 个答案:

答案 0 :(得分:2)

  

我尝试将变量从case传递到另一个但是它不起作用

这是因为or运算符(;,发布第一个planeinfo,!)会激活回溯并取消第一个read/1的效果。

如果要保持引擎(Eng),翼(Wing)和凸起(Bulges)的读取值,则必须使用括号来限制回溯效果;运算符。

不确定您想要获得什么,但......以下是一个示例

getplane:-
  write('enter engine type '),
  read(Eng),
  (  Eng == 'propeller' ,Name ='c130',
     planeinfo,!
   ;
     write('enter wing postion'),
     read(Wing),
     (  Wing == 'low' , Name = 'b747',
        planeinfo,!
      ;
        write('enter the bulges type '),
        read(Bulges),
        (  Bulges == 'upperwing' , Name = 'c141', write(Eng),write(Wing),
           planeinfo,!
         ;
           write('enter wing shape '),
           read(Shape),
           write('enter tail '),
           read(Tail),
           planeinfo,
           write("Plane Is Not Found , Please Retry"),
           repeat
        )
     )
  ).