Prolog 序言最老继承人

Prolog 序言最老继承人,prolog,Prolog,我正在开发一个简单的程序,它有一个人员数据库。在指定年份时,应注明当年的“国王”,国王是在世的最年长的人 为了简单起见,数据库中的所有人只要在给定的年份还活着,我假设没有双胞胎,都是合格的 我的问题是挑选某一年中活着的“最老”的人。我似乎不知道如何让Prolog检查所有可能的国王并挑选最老的 男性(杰克)。 男(罗伊)。 男性(ele)。 出生(杰克,2000年)。 born(dave,1999年)。 出生(罗伊,1980年)。 born(ele,1990年)。 死了(杰克,2100)。 死亡

我正在开发一个简单的程序,它有一个人员数据库。在指定年份时,应注明当年的“国王”,国王是在世的最年长的人

为了简单起见,数据库中的所有人只要在给定的年份还活着,我假设没有双胞胎,都是合格的

我的问题是挑选某一年中活着的“最老”的人。我似乎不知道如何让Prolog检查所有可能的国王并挑选最老的


男性(杰克)。
男(罗伊)。
男性(ele)。
出生(杰克,2000年)。
born(dave,1999年)。
出生(罗伊,1980年)。
born(ele,1990年)。
死了(杰克,2100)。
死亡(戴夫,2099)。
去世(罗伊,1990年)。
死亡(ele,1999年)。
%将X与所有其他可能的成功者进行比较,确保他出生在第一位。
老大(X,岁):-
出生(X,T1),
出生((可能的继承人(年),T2),
T1=年)。
继任者(年份):-
可能继任者(年份,X),
老大(X,岁),
写(X)。


如果您能帮助我们比较所有可能的答案,我们将不胜感激。我以前尝试过使用findall,但没有成功。

Prolog提供了一种限制形式的否定(失败否定),可以解决您的问题:

eldest(X,Year):-
    born(X,Year),
    \+((born(_,T), T<Year)).
这可以对所有对(Y,K)进行排序,然后我们可以选择结果的开头

编辑这个应该可以解决这个问题,但是我引入了一个服务谓词

eldest(X, Year):-
    alive(X, Year, B),
    \+((alive(_, Year, T), T<B)).

alive(X, Year, B) :- born(X, B), B =< Year, \+ (died(X, D), D < Year).

% must be male and have been born before or durring the given year and must not be dead.

possibleSuccessor(Year,X):-
    male(X),
    alive(X, Year, _).

successor(Year):-
    possibleSuccessor(Year,X),
    eldest(X,Year),
    write(X).
最年长者(X,岁):-
活着(X,年,B),

\+((活着(u,年,T),T表达式
born((可能的接受者(年,T)),T2)
没有你想象的功能。Prolog没有返回值的函数。它有用于查询和实例化参数的谓词。因此表达式总是会失败,因为没有与
born((可能的接受者(…),…)匹配的
fact或谓词
。这无疑是有帮助的,但我认为它并不能解决整个问题。这并没有考虑到人会死亡。经过测试,我发现除非你选择第一个出生的人,否则prolog将始终返回false,因为有人出生在他们之前。你是对的,我将年的论点误解为“大的”…我会尝试纠正它
eldest(X,Year):-
    setof((Y,K), born(K,Y), [(Year,X)|_]).
eldest(X, Year):-
    alive(X, Year, B),
    \+((alive(_, Year, T), T<B)).

alive(X, Year, B) :- born(X, B), B =< Year, \+ (died(X, D), D < Year).

% must be male and have been born before or durring the given year and must not be dead.

possibleSuccessor(Year,X):-
    male(X),
    alive(X, Year, _).

successor(Year):-
    possibleSuccessor(Year,X),
    eldest(X,Year),
    write(X).