【问题标题】:Is Prolog suitable for this kind of project?Prolog适合这种项目吗?
【发布时间】:2017-02-27 00:49:50
【问题描述】:

我正在做一个项目,我必须构建一个能够生成一堆前提的引擎,并且根据真实情况,告诉我还能推断出什么。给出的例子:

If John plays football then Mary makes cookies.
If Eric listens to rock then john doesn't play Football.
If Eric doesn't listen to rock then john plays Football.
Either Eric listens to rock or Luiza listens to rock.

当给定的真实事实是“Luiza 听摇滚”时,那么解决方案应该是:

Eric listens to rock = false
John plays football = true
Mary makes cookies = true

当真正的事实是“Eric 听摇滚”时,那么解决方案应该是:

Luiza listens to rock = false
Jonh plays football = false
Mary makes cookies = (can't solve)

当真正的事实是“约翰踢足球”时,那么解决方案应该是:

Mary makes cookies = true
Luiza listens to rock = (can't solve)
Jonh plays football = (can't solve)

问题:Prolog 是解决此类问题的正确工具吗?代码示例表示赞赏。

【问题讨论】:

  • 是的,Prolog 在这方面会很棒。

标签: prolog logic


【解决方案1】:

是的,Prolog 在这方面会很棒。

这是一个类似问题的例子:

/* 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,气球]]

【讨论】:

    猜你喜欢
    • 2012-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-16
    • 2011-04-06
    • 2013-07-24
    • 2012-07-04
    相关资源
    最近更新 更多