prolog - Prolog问题建模:不同颜色的对象
问题描述
我是编写 Prolog 的新手,想知道如何以对以后推理有用的方式陈述以下属性。
- 有 N 个对象。
- 每个物体都有颜色。
- 有三种可能的颜色:红色、绿色、蓝色
假设有两个对象:对象 1 是红色的,对象 2 具有不同的、未指定的颜色。我如何向 Prolog 询问对象 2 的可能颜色?我期待绿色和蓝色。
到目前为止我的代码:
object(obj_1).
object(obj_2).
color_value(red).
color_value(green).
color_value(blue).
color(Obj, Val) :- object(Obj), color_value(Val).
color(obj_1, red).
different_color(O1, O2) :- color(O1, X), color(O2, Y), X \= Y.
different_color(obj_1, obj_2).
当我查询可能的颜色时obj_2
,Prolog 包括red
. 所以我以某种方式做错了。
color(obj_2, A).
A = red ;
A = green ;
A = blue.
我怀疑我使用颜色和不同颜色的方式有问题。
解决方案
Your definition of color/1
offers redundant solutions for color(_, red)
or color(obj_1, _)
. Your clause for color(Obj, Val)
needs to exclude the case where Obj
is obj_1
or Val
is red
.
A simplistic approach could be:
color(Obj, Val) :-
dif(Obj, obj_1),
dif(Val, red),
object(Obj),
color_value(Val).
color(obj_1, red).
Also, consider @DavidTonhofer's comment about style. :)
推荐阅读
- python - 在没有精灵的基本乒乓球游戏中,我将如何检测桨和球之间的碰撞
- python - 将 python 列表中的数组转换为 pandas,最终转换为 df.sum()
- powershell - Connect-PnPOnline : 远程服务器返回错误: (403) Forbidden
- android-studio - Android studio imageView(电话)未显示
- angular - Angular 的 Apollo 客户端 Chrome Devtools 缓存为空
- python - 如何使用 sqlalchemy 进行查询
- multithreading - 在 Common Lisp Bordeaux Threads 中重新启动已退出的线程?
- django - 从 dict 按名称访问对象
- php - Laravel:在 FormRequest 规则上获取 ID
- kdb - 订阅者的订阅详情