列出所有可能的解决方案 Prolog

Listing all possible solutions Prolog

我是 prolog 的初学者并且 我想列出所有变量的所有可能解决方案,例如:

  word(V1,V2,V3) :- some code

我想要 V1V3 的所有可能值, 所以不是 returning

?-word(V1,V2,V3).
V1 = x1,
V2 = x2,
V3 = x3;
V1 = y1,
V2 = y2,
V3 = y3.

它return

V1 = [x1, y1]
V2 = [x2, y2]
V3 = [x3, y3] 

我尝试了 findall,但出现错误我不知道如何在这个示例中使用它。

您可以使用findall/3来收集列表列表中的所有解决方案。例如,考虑程序:

word(x1, x2, x3).
word(y1, y2, y3).

您得到以下结果:

?- findall([V1,V2,V3], word(V1,V2,V3), M).
M = [[x1, x2, x3], [y1, y2, y3]].

得到的列表M可以看作矩阵:

M = [[x1, x2, x3], 
     [y1, y2, y3]].

然而,你想要的答案是对应的转置矩阵:

T = [[x1, y1],
     [x2, y2],
     [x3, y3]].

要转​​置矩阵 M,您可以按如下方式组合 findall/3maplist/3and nth1/3

?- M = [[x1,x2,x3], [y1,y2,y3]], findall(L, maplist(nth1(_), M, L), T).
M = [[x1, x2, x3], [y1, y2, y3]],
T = [[x1, y1], [x2, y2], [x3, y3]].

因此,解决您问题的最终代码是:

words(V1, V2, V3) :-
   findall([V1,V2,V3], word(V1,V2,V3), M),
   findall(L, maplist(nth1(_), M, L), [V1,V2,V3]).

word(x1, x2, x3).
word(y1, y2, y3).

示例:

?- words(V1,V2,V3).
V1 = [x1, y1],
V2 = [x2, y2],
V3 = [x3, y3].