1

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

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

  1. K 先生在本周早些时候的某个时间比看到气球的那个人发现了他,但在本周晚些时候的某个时间,比发现风筝的那个人(不是 G 女士)发现了他的踪迹。
  2. 星期五的目击事件是由 Barn 女士或看到飞机的人(或两者兼有)造成的。
  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
4

1 回答 1

0

我知道您没有要求解决方案,但我发现很难描述如果没有可行的解决方案该怎么做。我为此道歉。

这是我要做的:

/*
1. K 先生在本周早些时候的某个时间比看到气球的人发现了他,但在本周晚些时候的某个时间,比发现风筝的人(不是 G 女士)发现了他的视线。
2. 星期五的目击事件是由 Barn 女士或看到飞机的人(或两者兼有)造成的。
3. Nik 先生周二没有出现。
4. K 先生不是那个对象原来是电线杆的人。
*/

?-
% 设置列表列表作为最终解决方案
        天数 = [[星期二,_,_],[星期三,_,_],[星期四,_,_],[星期五,_,_]],
/* 1 */ before([_,mr_k,_],[_,_,balloon],Days),
/* 1 */ before([_,_,kite],[_,mr_k,_],Days),
/* 2 */ (member([friday,ms_barn,_],Days);
            成员([星期五,_,飞机],天)​​;
            成员([星期五,ms_barn,飞机],天)​​),
% 填写其余的人
        成员([[_,mr_k,_],[_,ms_barn,_],[_,ms_g,_],[_,mr_nik,_]],天),
% 填充其余对象
        成员([[_,_,气球],[_,_,风筝],[_,_,飞机],[_,_,tele_pole]],天),
% 否定应该在解决方案被填充后完成
/* 1 */ 成员([_,NOT_ms_g,kite],Days), NOT_ms_g \= ms_g,
/* 3 */ member([tuesday,NOT_mr_nik,_],Days), NOT_mr_nik \= mr_nik,
/* 4 */ 成员([_,NOT_mr_k,tele_pole],天), NOT_mr_k \= mr_k,
    写(天),
    nl,
    失败。

% 检查 `X` 是否在 `Y` 之前
% 在列表 `Ds`
之前(X,Y,Ds):-
    余数(X,Ds,Rs),
    成员(Y,Rs)。

% 找到一个列表的成员并且
% 统一第三个参数如
% 它是剩余的元素
% 找到成员之后的列表
余数(X,[X|Ds],Ds)。
余数(X,[_|Ds],Rs):- 余数(X,Ds,Rs)。

% `member` 的扩展版本
% 检查第一个列表的成员是否
% 是第二个的所有成员
成员([],_)。
成员([X|Xs],Ds):-
    成员(X,Ds),
    成员(Xs,Ds)。

这给了我:

[[星期二,ms_g,tele_pole],
    [星期三,mr_nik,风筝],
    [星期四,mr_k,飞机],
    [星期五,ms_barn,气球]]
于 2016-11-15T01:39:23.447 回答