And*_*een 8 prolog switch-statement
在Prolog谓词中,我经常编写像这样的重复条件语句,但我希望它们能够更简洁地编写:
output(Lang, Type, Output) :-
(Lang = javascript ->
Output = ["function", Type];
Lang = ruby ->
Output = ["def", Type];
Lang = java ->
Output = [Type]).
Run Code Online (Sandbox Code Playgroud)
是否可以用更简洁的switch语句替换这一系列的条件语句?
在Prolog中,使用元谓词(将目标或谓词作为参数的谓词)定义自己的控制结构非常容易.
例如,您可以实现类似的开关构造
switch(X, [
a : writeln(case1),
b : writeln(case2),
c : writeln(case3)
])
Run Code Online (Sandbox Code Playgroud)
通过定义
switch(X, [Val:Goal|Cases]) :-
( X=Val ->
call(Goal)
;
switch(X, Cases)
).
Run Code Online (Sandbox Code Playgroud)
如有必要,可以通过许多Prolog系统(ECLiPSe中的inline/2或其他几个系统中的目标扩展)支持的编译时转换来提高效率.
通过运算符声明,您可以将语法调整到您喜欢的任何内容.
似乎为这个用例制作了多个条款,并且也非常简洁.
output(javascript, Type, ["javascript", Type]).
output(ruby, Type, ["def", Type]).
output(java, Type, [Type]).
Run Code Online (Sandbox Code Playgroud)