Prolog 序言初学者,组合规则问题?

Prolog 序言初学者,组合规则问题?,prolog,Prolog,我正试图根据这些事实编写一个程序: 博伊尔生于1627年,死于1691年。 牛顿生于1642年,死于1727年。 (等等) 我想创建一个规则来确定一个人是否在指定的年份内活着。以下是我到目前为止得出的结论: scientist(boyle, 1627, 1691). scientist(newton, 1642, 1727). alive_after(X) :- scientist(A, B, C), B < X. alive_before(X) :- scientist(A, B, C)

我正试图根据这些事实编写一个程序:

博伊尔生于1627年,死于1691年。 牛顿生于1642年,死于1727年。 (等等)

我想创建一个规则来确定一个人是否在指定的年份内活着。以下是我到目前为止得出的结论:

scientist(boyle, 1627, 1691).
scientist(newton, 1642, 1727).
alive_after(X) :- scientist(A, B, C), B < X.
alive_before(X) :- scientist(A, B, C), C > X.
alive_during(X, Year) :- alive_after(X), alive_before(X).
它不起作用。
我在这里遗漏了什么?

Prolog无法统一隐藏在谓词体中的变量。在
alive\u之后/1
中的
A
alive\u之前/1中的
A
之间没有关系。Prolog实际上告诉您,当它报告这些警告时,它不知道您在做什么:`

|: alive_after(X) :- scientist(A, B, C), B < X.
Warning: user://2:19:
    Singleton variables: [A,C]
|: alive_before(X) :- scientist(A, B, C), C > X.

Warning: user://2:23:
    Singleton variables: [A,B]
|: alive_during(X, Year) :- alive_after(X), alive_before(X).

Warning: user://2:27:
    Singleton variables: [Year]
X来自哪里?变量与查询中的值统一,它们不是从谓词体内部到达的

更直接的解决方案是使用Prolog内置的
between/3
谓词:

alive_during(Scientist, Year) :-
    scientist(Scientist, Birth, Death),
    between(Birth, Death, Year).
这样做的另一个好处是,它实际上会为您生成解决方案:

?- alive_during(boyle, X).
X = 1627 ;
X = 1628 ;
X = 1629 ;
X = 1630 ;
X = 1631 ;
另一个解决方案不具有此属性。如果您确实具有此生成属性,则可以编写一些有趣的谓词,例如:当代人/2:

contemporaries(S1, S2) :-
    alive_during(S1, Y),
    alive_during(S2, Y),
    dif(S1, S2).
这会生成许多不感兴趣的解决方案副本,但您可以通过使用
setof/3

?- setof(X-Y, contemporaries(X, Y), Contemporaries).
Contemporaries = [boyle-newton, newton-boyle].

这确实很好地解释了这一点。谢谢。@K.Hall很高兴能提供帮助,欢迎来到Prolog!不要因此而气馁,我们都是从同一个地方开始的。
alive_during(Scientist, Year) :-
    scientist(Scientist, Birth, Death),
    between(Birth, Death, Year).
?- alive_during(boyle, X).
X = 1627 ;
X = 1628 ;
X = 1629 ;
X = 1630 ;
X = 1631 ;
contemporaries(S1, S2) :-
    alive_during(S1, Y),
    alive_during(S2, Y),
    dif(S1, S2).
?- setof(X-Y, contemporaries(X, Y), Contemporaries).
Contemporaries = [boyle-newton, newton-boyle].