在Prolog中切换语句

时间:2016-03-03 06:32:12

标签: prolog switch-statement

在Prolog谓词中,我经常写这样的重复条件语句,但我希望它们能够更简洁地写出来:

output(Lang, Type, Output) :-   
    (Lang = javascript ->
        Output = ["function", Type];
    Lang = ruby ->
        Output = ["def", Type];
    Lang = java ->
        Output = [Type]).

是否可以用更简洁的switch语句替换这一系列的条件语句?

3 个答案:

答案 0 :(得分:7)

在Prolog中,使用元谓词(将目标或谓词作为参数的谓词)定义自己的控制结构非常容易。

例如,您可以实现像

这样的开关构造
switch(X, [
    a : writeln(case1),
    b : writeln(case2),
    c : writeln(case3)
])

通过定义

switch(X, [Val:Goal|Cases]) :-
    ( X=Val ->
        call(Goal)
    ;
        switch(X, Cases)
    ).

如果有必要,可以通过许多Prolog系统(ECLiPSe中的inline/2或其他几个系统中的目标扩展)支持的编译时转换来提高效率。

通过运算符声明,您可以将语法调整为您喜欢的任何内容。

答案 1 :(得分:6)

似乎为这个用例制作了多个条款,并且也非常简洁。

output(javascript, Type, ["javascript", Type]).
output(ruby, Type, ["def", Type]).
output(java, Type, [Type]).

答案 2 :(得分:1)

略短:

output(Lang, Type, Output) :-   
    (Lang, Output) = (javascript, ["function", Type]) ;
    (Lang, Output) = (ruby, ["def", Type]) ;
    (Lang, Output) = (java, [Type]).

惯用:

output(Lang, Type, Output) :-
  memberchk(Lang-Output, [
    javascript - ["function", Type],
    ruby - ["def", Type],
    java - [Type]
  ]).