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

列出所有可能的解决方案Prolog,prolog,Prolog,我是prolog和prolog的初学者 我想列出所有变量的所有可能解决方案,例如: word(V1,V2,V3) :- some code 我想要V1到V3的所有可能值, 因此,与其返回 ?-word(V1,V2,V3). V1 = x1, V2 = x2, V3 = x3; V1 = y1, V2 = y2, V3 = y3. 它回来了 V1 = [x1, y1] V2 = [x2, y2] V3 = [x3, y3] 我尝试了findall,但出现了一个错误,我不知道如何在本例中

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

  word(V1,V2,V3) :- some code
我想要
V1
V3
的所有可能值, 因此,与其返回

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

V1 = [x1, y1]
V2 = [x2, y2]
V3 = [x3, y3] 
我尝试了findall,但出现了一个错误,我不知道如何在本例中使用它。

您可以使用它收集列表列表中的所有解决方案。例如,考虑到该计划:

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 = [[x1, x2, x3], 
     [y1, y2, y3]].
T = [[x1, y1],
     [x2, y2],
     [x3, y3]].
要转换矩阵
M
,可以组合
findall/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].

请注意,变量必须以大写字母开头。是的,我知道我只是在这里用小写字母写的,很多都是有效的!