- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经有一段时间没有用 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).
但是我不知道如何调用它。
P.S.我正在使用 SWI-Prolog,如果这有什么区别的话。
最佳答案
是的,您走在正确的道路上。诀窍是用空累加器调用传递闭包,并在每一步中检查是否找到循环(即,我们以前是否见过这个家庭成员。正如“false”所指出的那样,这些人需要不过,在进入 not 之前已经实例化了。
总而言之,这是有效的:
family(john, jack).
family(matt, ann).
family(ann, jack).
family(jordan, michael).
family(michael, liz).
sameFamily(X, Y) :-
family(X, Y).
sameFamilySym(X, Y) :-
sameFamily(X, Y).
sameFamilySym(X, Y) :-
sameFamily(Y, X).
sameFamilyTrans(X, Y, Acc) :-
sameFamilySym(X, Y),
not(member(Y,Acc)).
sameFamilyTrans(X, Z, Acc) :-
sameFamilySym(X, Y),
not(member(Y,Acc)),
sameFamilyTrans(Y, Z, [X|Acc]).
person(X) :- family(X, _).
person(X) :- family(_, X).
gift(X, Y) :-
person(X),
person(Y),
X \= Y,
not(sameFamilyTrans(X, Y, [])).
一点背景知识:传递闭包实际上并不是一阶可定义的(参见 https://en.wikipedia.org/wiki/Transitive_closure#In_logic_and_computational_complexity )。因此可以预见,这会有点棘手。
关于prolog - 简单的 prolog 程序过早返回 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20317450/
我的测试代码: int SIZE = 1900; int[][] array = new int[SIZE][]; for (int i = 0; i < SIZE; i++) { array[i
我有一堆 WAV 文件和一个将它们复制到另一个目录的脚本,但使用 SoX 处理了一些文件。输出的文件都应该有 1 个 channel ,采样率不超过 44.1khz。我的大多数文件要么有一个以上的 c
我正在运行一个相当占用内存的 Python 脚本,但似乎我的机器正在提前终止进程。我安装了 16GB(并通过 lshw -class memory 确认),但我的进程似乎在使用量达到 4GB 左右时被
我很难确定在使用 .NET 的 HttpWebRequest 类调用远程服务器(特别是 REST Web 服务)时是否有办法处理潜在的连接问题。根据我的调查,WebClient 类的行为是相同的,这在
所以我有这个网址: http://test.com/afolder/who-else-wants-to-make-horror-movies%3f/ 这是 URL 编码版本: http://test.
我是一名优秀的程序员,十分优秀!