我刚刚开始逻辑编程(在Prolog中),它与procedure / OO非常不同。请帮忙:
male(a).
male(b).
male(c).
female(x).
female(y).
append([],X,X).
append([X|Y],Z,[X|W]):- append(Y,Z,W).
partners(X,Y):- male(X), female(Y).
我试图写一个谓词getAllPartners(MyList,Output),它输出一个包含所有可能的合作伙伴组合的列表。我不介意在列表中有0,但如果有人想出输出列表中没有0的方法,那就太棒了。 这是我的小车,蹩脚的'代码,请帮助:
getAllPartners(MyList, Output):-
append([],0,MyList),
partners(X,Y),
append(MyList,X,Output),
append(Output,Y,MyList),
append(MyList,0,Output).
答案 0 :(得分:0)
Prolog有一个内置findall
:
getAllPartners(L) :-
findall((M,F),(male(M),female(F)),L).
甚至更紧凑:
getAllPartners(L) :-
findall((M,F),partners(M,F),L).
致电时:
getAllPartners(L).
它会回复:
L = [ (a, x), (a, y), (b, x), (b, y), (c, x), (c, y)].
您也可以手动生成列表,但问题在于partners(X,Y)
将始终与同一个人绑定。因此,您的列表为[ a, x, 0, a, x, 0, a, x, 0, ...]
。您应该解决的另一个问题是您附加“列表”而不是“列表”和“元素”。