如何在序言规则中接受 k 个术语?

时间:2021-05-06 20:22:36

标签: 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),如果 List1 以匹配“begin end”的原子开始,然后继续 List2 中的原子,那么这是真的。

返回 true 的示例是:

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

我当前的 blck 代码采用 _ 作为术语。但是,它仅适用于单个术语,我希望它接受 k 个术语。或者更好的 stmts()。我完全不知道如何在定义中使用 k 个术语。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

您不能使用通配符 output = array([14,17,32,35]) 来代表任意数量的变量。正如已经从 _ 开始的那样,需要涉及某种递归,但这也需要适当的递归结束或基本情况。 stmts 是一个循环定义,它总是产生相同的列表。相反,每个步骤都应该使用一个语句,并且整个递归必须以 stmts 结束。

在以下方法中,blck 以 end 开头并传递给 begin,然后检查语句直到找到 body(结果为 end) ,或空列表或非语句(结果为 true)。

false
相关问题