【发布时间】:2013-12-01 21:26:02
【问题描述】:
我已经有一段时间没有在 Prolog 中编程了。今天,我试着做一个简单的程序。它列出了谁属于同一个家庭的一些事实。如果两个人属于同一个家庭,他们不能互相赠送礼物。我想让所有人(或至少一个人)允许某人送礼。
family(john, jack).
family(matt, ann).
family(ann, jack).
family(jordan, michael).
family(michael, liz).
sameFamily(X, Y) :-
family(X, Y).
sameFamily(X, X) :-
false.
sameFamilySym(X, Y) :-
sameFamily(X, Y).
sameFamilySym(X, Y) :-
sameFamily(Y, X).
sameFamilyTrans(X, Z) :-
sameFamilySym(X, Y),
sameFamilySym(Y, Z).
gift(X, Y) :-
not(sameFamilyTrans(X, Y)).
如果sameFamilyTrans/2 返回false 的一些查询实际上应该返回true。
sameFamilyTrans/2 显然是错误的。我想我需要保留一个中间传递性列表。像这样的:
sameFamilyTrans(X, Z, [Y|Ys]) :-
sameFamilySym(X, Y, []),
sameFamilyTrans(Y, Z, Ys).
但是我不知道怎么称呼它。
附注我正在使用 SWI-Prolog,如果这有什么不同的话。
【问题讨论】:
标签: prolog