prolog - 如何在序言规则中接受 k 项?
问题描述
我有这个代码:
stmt([pass|Tail], Tail) :- !.
stmt([use, X|Tail], Tail) :- atom(X),!.
stmt([declare, X|Tail], Tail) :- atom(X),!.
stmts(X, X) :- !.
stmts(X, Y) :- stmt(X, Z), stmts(Z, Y).
blck([begin, _, end|Tail], Tail) :- !.
我的目标是给定一个 blck(List1, List2),如果 List1 从匹配“begin <stmts> end”的原子开始,然后继续使用 List2 中的原子,这是正确的。
返回 true 的示例是:
blck([begin,declare,x,use,x,end,tail],[tail]).
我当前的 blck 代码以 _ 作为术语。但是,它只适用于单个术语,我希望它接受 k 个术语。或者更好的是 stmts()。我完全不知道如何在定义中使用 k 个术语。任何帮助表示赞赏。
解决方案
您不能_
为任意数量的变量使用通配符。正如已经开始的stmts
那样,需要涉及某种递归,但这也需要适当的递归结束或基本情况。stmts
是一个循环定义,总是产生相同的列表。相反,每个步骤都应该使用一个语句,并且整个递归必须在end
.
在下面的方法中, blck 从 a 开始begin
并传递给 a body
,然后它检查语句,直到end
找到 a (结果为true
),或者一个空列表或非语句(结果为false
)。
body([end|Tail], Tail).
body(Statements, Tail) :- stmt(Statements, T1), body(T1,Tail).
blck([begin|Body], Tail) :- body(Body, Tail).
推荐阅读
- mysql - Mysql:如何替换字符串的一部分?
- r - 为什么我的数据框中的 min() 和 max() 会导致“NA”?
- flutter - Flutter:通知监听器,如何让onNotification动态化
- patch - Yocto - 在补丁中使用变量
- javascript - 为 svg 路径元素提供数字
- c++ - 为什么我不能在类中使用参数构造函数?
- ruby-on-rails - Ruby:Case 语句中的两个条件
- node.js - 无法将第二个 mondgoDB 集合导入 Atlas
- amazon-redshift - DATE间隔函数在sql中给出错误
- c - 只有特定用户才能执行此程序