【发布时间】:2014-10-07 03:05:20
【问题描述】:
我有一个通过调用list1(a,X) 定义为list1(a,[_,a,_]). 的模式,它会给出:
X = [_G3801, a, _G3807].
我需要写一个谓词match(X, List_in, List_out),这样通过调用它
Listin = [[b,a,b],[b,b,a],[a,a,a],[c,c,b]],它可以给出所有匹配的模式。像这样的:
list1(a,X),match(X,[[b,a,b],[b,b,a],[a,a,a],[c,c,b]], List_out).
那么它可以给出:
List_out = [[b,a,b],[a,a,a]].
我试过list1(a,X),include(member(X),[[b,a,b],[b,b,a],[a,a,a],[c,c,b]],Y).
它给出了
X = [_G4381, a, _G4387],
Y = [].
这不是我需要的。
谓词应该能够泛化,因为 list1(a,X) 可以任意定义,
例如给list2(a,[_,_,_]),然后
list2(a,X),match(X,[[b,a,b],[b,b,a],[a,a,a],[c,c,b]], List_out).
应该给
List_out =[[b,a,b],[b,b,a],[a,a,a],[c,c,b]].
(X 必须是变量列表,因为它实际上是程序其他部分的结果,我只是使用list1(a,X) 来演示问题)。
棘手的部分是我不能逐个元素检查,X 只会与第一个匹配项统一,而错过所有其他匹配项。这更像是打电话:
list1(a,X),member(X,[[b,a,b],[b,b,a],[a,a,a],[c,c,b]]).
X = [b, a, b] ;
X = [a, a, a] ;
false.
找到第一个匹配后,只能回溯寻找第二个。 但是如何将所有回溯结果放入一个输出列表中?有人可以帮帮我吗?
【问题讨论】:
-
你试过使用
bagof谓词吗? -
谢谢,这正是我要找的!
标签: list variables prolog pattern-matching