【发布时间】:2019-03-09 17:39:25
【问题描述】:
这是我的问题。
我的事实和规则:
fact1(green, red, blue).
fact1(purple, white, gray).
fact2(green, orange).
fact2(purple, cyan).
fact3(green, pink).
fact3(purple, black).
foo(A,B,C,D,E) :-
fact1(A,B,C),
fact2(A,D),
fact3(A,E),
write(A),
write(B).
现在如果我问 SWI-Prolog foo(A,B,C,D,E). 输出是
?- foo(A,B,C,D,E).
greenred
A = green, B = red, C = blue, D = orange, E = pink ;
purplewhite
A = purple, B = white, C = gray, D = cyan, E = black.
我的目标是用户只看到线条
greenred
purplewhite
为了实现这一点,我尝试像这样更改foo 的定义:
foo() :-
fact1(A,B,C),
fact2(A,D),
fact3(A,E),
write(A),
write(B).
但是这个谓词的输出只有:
?- foo().
greenred
true.
不是我所期望的:
?- foo().
greenred
purplewhite
true.
非常欢迎任何帮助。
【问题讨论】:
-
你是什么意思“但当然总是输出......”?你没有告诉我们你的事实是什么样的,所以我们不知道你的预期输出是什么。你真的有多个匹配的事实吗?你能包括一些我们可以重现的最小(虚拟)数据吗?我尝试了一些,但无法重现您的问题。所以要么问题出在你没有向我们展示的代码中,要么我不明白你的意思。你怎么运行这个?你在做什么来尝试获得多个匹配项?
-
感谢您的回答,我用一些虚拟代码编辑了我的问题。希望现在你明白我的意思了。
-
感谢您的更新。哦,是你有问题的
true输出吗?即使在foo().上按空格键仍然会给我后续的比赛,但它也会在每次比赛后打印true,而foo(A,B,C,D,E).不会这样做? -
我再次测试了它,我真的只得到了第一个与 foo() 匹配的结果,然后是真的,然后什么也没有。是的,正如你所说,我也没有得到真正的字里行间,如果可能的话,这也是我想要的。也许这是一个swi-prolog的东西?或者你知道我如何实现我想要的结果的另一种方法吗?
-
好的,所以我使用 swish only 编辑器测试了我的代码,现在我得到了与 @mercator 相同的输出。有趣
标签: prolog