如何接受序言规则中的 k 个术语?
How to accept k terms in a prolog rule?
我有这个代码:
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 end”的原子开始,然后继续 List2 中的原子,则为真。
一个 return 正确的例子是:
blck([begin,declare,x,use,x,end,tail],[tail]).
我当前的 blck 代码采用 _ 作为术语。但是,它只适用于单个术语,我希望它接受 k 个术语。或者更好的是 stmts()。我完全不知道如何在定义中使用 k 项。感谢任何帮助。
通配符 _
不能代表任意数量的变量。正如已经从 stmts
开始的那样,需要涉及某种递归,但这也需要适当的递归结束或基本情况。 stmts
是一个循环定义,它总是产生相同的列表。相反,每个步骤都应该使用一条语句,并且整个递归必须在 end
.
结束
在下面的方法中,blck 以 begin
开始并传递到 body
,然后检查语句直到找到 end
(结果为 true
), 或空列表或非语句(结果为 false
).
body([end|Tail], Tail).
body(Statements, Tail) :- stmt(Statements, T1), body(T1,Tail).
blck([begin|Body], Tail) :- body(Body, Tail).
我有这个代码:
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
一个 return 正确的例子是:
blck([begin,declare,x,use,x,end,tail],[tail]).
我当前的 blck 代码采用 _ 作为术语。但是,它只适用于单个术语,我希望它接受 k 个术语。或者更好的是 stmts()。我完全不知道如何在定义中使用 k 项。感谢任何帮助。
通配符 _
不能代表任意数量的变量。正如已经从 stmts
开始的那样,需要涉及某种递归,但这也需要适当的递归结束或基本情况。 stmts
是一个循环定义,它总是产生相同的列表。相反,每个步骤都应该使用一条语句,并且整个递归必须在 end
.
在下面的方法中,blck 以 begin
开始并传递到 body
,然后检查语句直到找到 end
(结果为 true
), 或空列表或非语句(结果为 false
).
body([end|Tail], Tail).
body(Statements, Tail) :- stmt(Statements, T1), body(T1,Tail).
blck([begin|Body], Tail) :- body(Body, Tail).