【问题标题】:Prolog, X is older than YProlog,X 比 Y 更老
【发布时间】:2020-09-09 14:01:17
【问题描述】:

我需要编写一个谓词,如果 X 早于 Y,则为真。我的代码如下。我还没有看到任何问题。请帮帮我。

born(jan, date(20, 3, 1977)).

born(joris, date(17, 3, 1995)).

born(jesus, date(24, 12, 0)).

born(joop, date(30, 4, 1989)).

before(date(_, _, Year1), date(_, _, Year2)) :-
      Year1 < Year2.

before(date(_, Month1, Year ), date(_, Month2, Year)) :-
      Month1 < Month2.

before(date(Day1, Month, Year ), date(Day2, Month, Year)) :-
      Day1 > Day2.

older(X, Y) :-
      X \= Y,
      born(X, B1),
      born(Y, B2),
      before(B1, B2). 

查询应该给出这个。

?- older(jesus, Y).
jan,
joris,
joop.

【问题讨论】:

  • 我不确定这是您报告问题的根源,但您是否有意使用 Month1 &lt; Month2Day1 &gt; Day2 ?我会想那些 V 形会是一样的?
  • 没有。感谢您的纠正。

标签: prolog predicate


【解决方案1】:

older/2 中的比较 X\= YX 和/或 Y 可能未实例化时发出,这将失败。您必须在知道它们是用正确的值实例化后进行比较,即在为它们中的每一个调用 born/2 之后:

older(X, Y) :-
      born(X, B1),
      born(Y, B2),
      X \= Y,
      before(B1, B2). 

另外,正如cmets中提到的,before/2的第三个子句应该是:

before(date(Day1, Month, Year ), date(Day2, Month, Year)) :-
      Day1 < Day2.

示例运行:

?- older(jesus, Y).
Y = jan ;
Y = joris ;
Y = joop ;
false.

【讨论】:

  • 是的,它奏效了。我现在明白了。非常感谢!
  • 如果每个人只能过一个生日,那么\=就完全不需要了:before只有在生日不同的情况下才能成功,这意味着人也不同。
  • @IsabelleNewbie 确实。如果一个人只有一个生日,那么比较`X \=Y`对于计算正确解的过程来说不是必需的。
猜你喜欢
  • 2012-01-29
  • 1970-01-01
  • 1970-01-01
  • 2020-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-02
相关资源
最近更新 更多