列出所有可能的解决方案Prolog
我是prolog和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,但出现了一个错误,我不知道如何在本例中
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].
请注意,变量必须以大写字母开头。是的,我知道我只是在这里用小写字母写的,很多都是有效的!