You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:能否用Prolog解决逻辑课作业?含说谎者问题及代码报错

Prolog逻辑作业问题与代码修复

作业背景

5人被审问,A和B的陈述丢失。

  • C称:如果A诚实,那么B诚实。
  • D称:如果C诚实,那么A诚实。
  • E称:如果D诚实,那么A诚实。

需解答:

  1. C是否可能说谎?
  2. D是否可能说谎?
  3. E是否可能说谎?

代码问题

编写的Prolog代码如下:

f(A, B, C, D, E):-
    (C->(A->B)),
    (D->(C->A)),
    (E->(A->D)).

代码可正常编译,但执行查询f(A, B, C, D, E).时,出现错误:Arguments are not sufficiently instantiated。

问题原因与修复

Prolog中的->是if-then-else控制结构,并非逻辑上的蕴含关系。当变量未被实例化时,->无法进行求值,这就是报错的直接原因。

逻辑上的蕴含P → Q等价于¬P ∨ Q,在Prolog中可以用\+ P ; Q表示(\+代表否定,;代表逻辑或)。同时需要约束所有变量只能取布尔值true或false,确保变量被实例化。

修正后的代码:

f(A, B, C, D, E) :-
    % C的陈述:A→B 等价于 ¬A ∨ B
    (\+ A ; B),
    % D的陈述:C→A 等价于 ¬C ∨ A
    (\+ C ; A),
    % E的陈述:D→A 等价于 ¬D ∨ A
    (\+ D ; A),
    % 约束变量为布尔值
    member(A, [true, false]),
    member(B, [true, false]),
    member(C, [true, false]),
    member(D, [true, false]),
    member(E, [true, false]).

作业问题的查询方式

  1. 判断C是否可能说谎
    直接查询C为false时是否存在合法解:
?- f(A,B,false,D,E).

若返回结果,则说明C可能说谎。

  1. 判断D是否可能说谎
    查询D为false时是否存在合法解:
?- f(A,B,C,false,E).
  1. 判断E是否可能说谎
    查询E为false时是否存在合法解:
?- f(A,B,C,D,false).

内容的提问来源于stack exchange,提问作者René Ederer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 15:38:34