首页 > 解决方案 > 如何在序言规则中接受 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 个术语。任何帮助表示赞赏。

标签: prolog

解决方案


您不能_为任意数量的变量使用通配符。正如已经开始的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).

推荐阅读