prolog - 在 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 常量以小写字母开头,如果您想拥有不遵循此约定的常量,您必须通过'('
. 为了将它们与保留关键字区分开来,转义需要保持不变。这仍然比 C 更好,例如,int void = 0
禁止语句在哪里,并且没有转义将其写下来。
您可能还想考虑您的谓词应该做什么。一元谓词 likes/1
只能告诉您您通过的术语是否满足您的要求。如果您想从中创建一些东西(例如对 if-then-else 的评估),您将需要两个 arguments s(Ast, Evaluation)
。
另一个观察结果是您已经在处理符号表示:您的代码生成例如一个列表[if, '(', Cond, ')', TrueBranch]
,其中if
只占用一个空格(一个字符串将使用两个)。但如果表示是象征性的,为什么不将括号表示为lparen
and rparen
?或者更好的是,if
只有两个/三个参数,为什么不将它表示为if(Cond, TrueBranch)
and if(Cond, TrueBranch, ElseBranch)
?
推荐阅读
- python - 一旦 X 数量的推文存储在 CSV 中,如何停止 Tweepy?
- excel - 在 Excel 中识别具有重复 ID 的冲突单元格
- c# - 避免在准备好的语句中出现空变量错误
- vba - 如何处理间歇性弹出窗口
- sql - 按日期计数和分组,但也有第三个 WHERE 列
- django - 多对多入通知不起作用
- r - 使用交替的“非连接重复变量”而不是 .x,.x,.x,.y,.y,.y 格式和相应的计算来进行 full_join 的方法
- html - 尝试使用 html 和 nodejs 将登录表单输入发送到数据库
- python-3.x - 如何使用 Selenium 从 Python 中点击 Next 按钮?
- java - 基于一个字符而不是其他字符的拆分操作