我需要写一个prolog程序" dump。"可以从具有约束的数据库中获取数据:
想象一下这个简单的数据库a(Int,Color)
a(1,blue).
a(1,red).
a(1,green).
a(2,green).
a(3,yellow).
a(3,blue).
a(4,green).
a(4,purple).
a(4,blue).
a(4,red).
我需要我的程序" dump。"给我所有与Color' blue'相关的Int元素。和' red'并且与任何其他颜色相关,仅输出非蓝色和红色的颜色。一个示例查询将是
?- dump.
1 green
4 purple
4 green
true
这里我不在乎知道3与黄色有关,因为3与蓝色和红色无关。
任何人都可以帮助我吗? :)
答案 0 :(得分:1)
首先,坚持纯粹的关系!没有必要打印东西,因为Prolog会为您打印。
run()
答案 1 :(得分:0)
尝试一下这个:
dump :-
a(X,C) , % find an int/color pair
related_to_red_and_blue(X) , % - such that the int is related to both red and blue, and
not_red_or_blue(C) , % - such that the color is not red or blue itself.
dump(X,C) , % - log to the console
fail . % - fail, inducing backtracking to find the next solution,
dump. % and finally, succeed.
related_to_red_and_blue(X) :- a(X,red) , a(X,blue) .
not_red_or_blue(C) :- C \= red , C \= blue .
它确实假设没有颜色多次与同一个整数相关。它也会始终成功,即使没有任何东西符合约束条件。
您也可以执行以下操作,重复使用上述related_to_red_and_blue/1
和not_red_or_blue/1
谓词:
dump :-
setof( X:C , ( a(X,C) , related_to_red_and_blue(X) , not_red_or_blue(C) ) , Matches ) ,
dump(Matches)
.
dump( [] ) .
dump( [X:C|Ms] ) :-
write(X) ,
write(' ') ,
write(C) ,
nl ,
dump(Ms)
.
以上
setof/3
查找与约束匹配的不同对。如果没有任何内容符合约束条件,它将失败。