Prolog列表 - 查找具有多个约束的项目

时间:2015-06-02 17:58:42

标签: list prolog constraints

我需要写一个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与蓝色和红色无关。

任何人都可以帮助我吗? :)

2 个答案:

答案 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/1not_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查找与约束匹配的不同对。
  • 以递归方式将它们转储到控制台
  • 成功。

如果没有任何内容符合约束条件,它将失败。