在prolog中创建if-else

在prolog中创建if-else,prolog,Prolog,我试图在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]). %runnin

我试图在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常量以小写字母开头,如果希望有不符合此约定的常量,则必须通过
对其进行转义(“
。为了将它们与保留关键字区分开来,转义需要保持不变。这仍然比C好,例如,
int void=0
是一个禁止的语句,不能转义将其写下来

您可能还需要考虑谓词应该做什么。像
s/1
这样的一元谓词只能告诉您传递的术语是否满足您的要求。如果您想从中创建一些内容(例如对if-then-else的求值),则需要两个参数
s(Ast,evaluation)


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

您的代码现在没有多大意义。请寻找。这是您正在搜索的工具,在大多数序言中都可以找到,当然在SWISH中也可以找到。