我通过调用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.
找到第一场比赛后,它只能回溯找到第二场比赛。 但是,如何将所有回溯结果放入单个输出列表中?有人可以帮帮我吗?
答案 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]].
很好!