在Prolog中解决一个谜题



我是prolog新手,我正在尝试解决这个难题。我在youtube上做了一些关于prolog基础知识的教程,但我需要一些帮助来解决下面的难题。

两周前,四个爱好者在他们附近看到了天空中的物体。四个人都在不同的一天报告了他或她的目击事件。联邦调查局来了,并给每个人一个不同的解释,他或她"真正"看到了什么。你能确定每个人看到这个物体的日期(星期二到星期五),以及它原来是什么物体吗?

  1. 。K的目击时间比看到气球的人早,但比发现风筝的人(不是G女士)晚。
  2. 周五的目击是由巴恩女士或看到飞机的人(或两者)拍摄的。
  3. 。尼克并没有在周二露面。
  4. 。原来是电线杆的对象不是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,气球]]

相关内容

  • 没有找到相关文章

最新更新