我是prolog新手,我正在尝试解决这个难题。我在youtube上做了一些关于prolog基础知识的教程,但我需要一些帮助来解决下面的难题。
两周前,四个爱好者在他们附近看到了天空中的物体。四个人都在不同的一天报告了他或她的目击事件。联邦调查局来了,并给每个人一个不同的解释,他或她"真正"看到了什么。你能确定每个人看到这个物体的日期(星期二到星期五),以及它原来是什么物体吗?
- 。K的目击时间比看到气球的人早,但比发现风筝的人(不是G女士)晚。
- 周五的目击是由巴恩女士或看到飞机的人(或两者)拍摄的。
- 。尼克并没有在周二露面。
- 。原来是电线杆的对象不是K。
我已经正确地设置了规则,但我似乎无法理解逻辑。我在寻求指导,而不是直接的答案。在最右边,我列出了我试图回答的每个问题的数字
enthu(mr_k).
enthu(ms_barn).
enthu(ms_g).
enthu(mr_nik).
object(ballon).
object(kite).
object(plane).
object(tele_pole).
day(tuesday).
day(wednesday).
day(thursday).
day(friday).
sight(X,ballon).
sighting(mr_k):- 1
day(X),
sight(X,Y),
didntc_kite(ms_g).
friday_sight:- enthu(ms_barn); 2
saw(X,plane);
both(ms_barn,X).
nosight_tuesday(mr_nik,X). 3
no_telepole(mr_k,Y). 4
我知道你没有要求解决方案,但我发现很难描述没有可行的解决方案该怎么办。我为此道歉。
我会这样做:
<>之前/*1. K先生发现风筝的时间比看到气球的人早,但比发现风筝的人(不是G女士)晚。2. 周五的目击事件要么是巴恩干的,要么是看到飞机的那个人干的(或者两者都干)。3.尼克周二没有露面。4. K先生并不是那个把电线杆当作物品的人。*/?列一个清单作为最终的解决方案天=[[星期二,_,_],[周三,_,_],[周四,_,_],[周五,_,_]],/* 1 */before([_,mr_k,_],[_,_,balloon],Days),/* 1 */before([_,_,kite],[_,mr_k,_],Days),/* 2 */(member([星期五,ms_barn,_],Days);(周五,_,飞机,天);(周五,ms_barn,飞机,天)),填上其余的人成员([[mr_k _, _], [ms_barn _, _], [ms_g _, _], [mr_nik _, _]],天),%填入其余的对象成员([[_,_,气球],[_,_,风筝],[_、_、平面],[_,_,tele_pole]],天),否定应该在填充解决方案后进行/* 1 */成员(_ NOT_ms_g,风筝,天),NOT_ms_g = ms_g,/* 3 */成员(星期二,NOT_mr_nik, _,天),NOT_mr_nik = mr_nik,/* 4 */成员([_,NOT_mr_k tele_pole],天),NOT_mr_k = mr_k,写(天)问,失败。%检查"X"出现在"Y"之前在列表"d"中的百分比之前(X, Y, Ds): -剩余(X, Ds, Rs),成员(Y, Rs)。%查找列表和的成员%统一第三个参数,如%表示它是其中的剩余元素%查找到的成员后面的列表剩余(X, X | Ds, Ds)。余数(X,[_|Ds],Rs):-余数(X,Ds,Rs)。%"成员"的扩展版本%检查第一个列表的成员%是第二类的所有成员成员([],_)。成员([X | X], Ds): -成员(X, Ds),成员(Xs, Ds)。之前这给了我:
<>之前[[星期二,电线杆],[星期三,尼克先生,风筝],[星期四,mr_k,飞机],[星期五,ms_barn,气球]]