首页 > 解决方案 > 在 prolog 中创建 if else

问题描述

我正在尝试在 prolog 中创建 if/else 验证,但实际上我无法将括号作为谓词“参数”传递,代码如下

s(Z):- si(X), vp(Y), append(X,Y,Z).
si(Z):- i(X), openParent(Y), append(X,Y,Z).
vp(Z):- cond(X), closeParent(Y), append(X,Y,Z).

i([if]).
openParent(['(']).
closeParent([')']).
cond([cond]).

%running s(X) to see all the possibilities:
%expected : if, (, cond, )
%output : if, '(', cond, ')'

在 openParent 和 closeParent 上,我想传递不带引号的括号,但如果这样做,执行会出错。

标签: prolog

解决方案


Prolog 常量以小写字母开头,如果您想拥有不遵循此约定的常量,您必须通过'('. 为了将它们与保留关键字区分开来,转义需要保持不变。这仍然比 C 更好,例如,int void = 0禁止语句在哪里,并且没有转义将其写下来。

您可能还想考虑您的谓词应该做什么。一元谓词 likes/1只能告诉您您通过的术语是否满足您的要求。如果您想从中创建一些东西(例如对 if-then-else 的评估),您将需要两个 arguments s(Ast, Evaluation)

另一个观察结果是您已经在处理符号表示:您的代码生成例如一个列表[if, '(', Cond, ')', TrueBranch],其中if只占用一个空格(一个字符串将使用两个)。但如果表示是象征性的,为什么不将括号表示为lparenand rparen?或者更好的是,if只有两个/三个参数,为什么不将它表示为if(Cond, TrueBranch)and if(Cond, TrueBranch, ElseBranch)


推荐阅读