如何在prolog规则中接受k术语?

如何在prolog规则中接受k术语?,prolog,Prolog,我有以下代码: 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),

我有以下代码:

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中的原子开始,则这是正确的

返回true的示例如下:

blck([begin,declare,x,use,x,end,tail],[tail]).

我目前为blck编写的代码将uu作为一个术语。但是,它只适用于一个术语,我希望它接受k个术语。或者更好的是stmts()。我完全不知道你如何定义k个术语。非常感谢您的帮助。

您不能使用通配符
\u
表示任何数量的变量。正如已经从
stmts
开始的那样,需要涉及某种递归,但这也需要一个适当的递归结束或基本情况
stmts
是一个循环定义,它总是产生相同的列表。相反,每个步骤都应该使用一条语句,整个递归必须在
end
结束

在下面的方法中,blck从
begin
开始,并传递到
主体
,然后主体检查语句,直到找到
end
(结果为
true
),或空列表或非语句(结果为
false

body([end|Tail], Tail).
body(Statements, Tail) :- stmt(Statements, T1), body(T1,Tail).

blck([begin|Body], Tail) :- body(Body, Tail).