Prolog - 使用变量匹配相似的模式

时间:2014-10-07 03:05:20

标签: list variables prolog pattern-matching

我通过调用list1(a,[_,a,_]).将模式定义为list1(a,X),它会发出:

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.

找到第一场比赛后,它只能回溯找到第二场比赛。 但是,如何将所有回溯结果放入单个输出列表中?有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:1)

似乎你做的比以前复杂得多:

list1(E, [_,E,_]).
pred1(X) :- list1(a,X),member(X,[[b,a,b],[b,b,a],[a,a,a],[c,c,b]]).

将给出

?- pred1(X).
X = [b, a, b] ;
X = [a, a, a] ;

然后你可以将你的查询包装在findall / 3中。 '服务谓词' list1 / 2它无用,使用(=)/ 2(即统一) - 而不是:

pred1(X) :- X=[_,a,_],member(X,[[b,a,b],[b,b,a],[a,a,a],[c,c,b]]).

Prolog仍然能够让我感到惊讶(具体来说,include / 3)。我试过(部分)你的代码

?- include(member(X),[[b,a,b],[b,b,a],[a,a,a],[c,c,b]],Y).
X = b,
Y = [[b, a, b], [b, b, a], [c, c, b]].

很好!