在Prolog中添加列表

时间:2014-08-15 03:15:02

标签: prolog

我刚刚开始逻辑编程(在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).

1 个答案:

答案 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, ...]。您应该解决的另一个问题是您附加“列表”而不是“列表”和“元素”。