从prolog查询返回第n个最年长的子项

从prolog查询返回第n个最年长的子项,prolog,Prolog,我想做的是定义一个查询,返回一个人的第n个最年长的孩子,在本例中是John。第一大的是玛吉。第二大的是马丁内斯,第三大的是玛丽 我是prolog新手,网站上提供的教程都是用一些过时的flash脚本编写的,这些脚本早已过时,不受支持,所以我在这里有些茫然。提前感谢您的帮助。比较孩子的年龄。P与or统一= 收集所有孩子,对他们进行分类,然后挑选第n个最大的 ch_compare(P, C1, C2) :- age(C1, A1), age(C2, A2), compare(P, A2, A1).

我想做的是定义一个查询,返回一个人的第n个最年长的孩子,在本例中是John。第一大的是玛吉。第二大的是马丁内斯,第三大的是玛丽


我是prolog新手,网站上提供的教程都是用一些过时的flash脚本编写的,这些脚本早已过时,不受支持,所以我在这里有些茫然。提前感谢您的帮助。

比较孩子的年龄。P与or统一=

收集所有孩子,对他们进行分类,然后挑选第n个最大的

ch_compare(P, C1, C2) :- age(C1, A1), age(C2, A2), compare(P, A2, A1).
我建议您仔细阅读谓词
findall/3
predsort/3

编辑:如果您想要按年龄排序的孩子列表,那么您有

nth_child_of(N, Parent, Child) :-
  findall(C, child(Parent, C), Children),
  predsort(ch_compare, Children, Sorted), 
  nth1(N, Sorted, Child).
  • 进行
    查询
    ,获取
    人员0的所有子项
  • 形成结果,使
    年龄
    在学期中排在第一位
  • 对查询使用
    setof
    ,以便按
    AGE
    从最年轻到最老对结果进行排序
  • 将最年轻到最老的列表反转,以获得最老到最年轻的列表
  • 从最早到最年轻的元素列表中获取第n个元素

  • 最简单的解决方案是收集列表中的所有子项,然后对它们进行排序。看看findall谓词。
    网站上提供的教程
    哪个网站?这超出了我的期望,谢谢。@RozarNatrim:如果您满意,请接受答案。它并不像我认为您期望的那样解决。第n个孩子(父母):-findall(C,是(C,父母),孩子的孩子)。也不能以我期望的方式解决问题(请注意,我交换了C和父级)。这就是我描述它的方式。不知道为什么列表没有返回。你能给我看一下你的最终代码吗?我无法理解你的变化。为什么你的第n个孩子是一元谓词?@RozarNatrim你想要一个人的孩子列表,按年龄降序排列?
    nth_child_of(N, Parent, Child) :-
      findall(C, child(Parent, C), Children),
      predsort(ch_compare, Children, Sorted), 
      nth1(N, Sorted, Child).
    
    ch_compare(P, C1, C2) :- age(C1, A1), age(C2, A2), compare(P, A2, A1).
    children(Parent, Children) :-
      findall(C, child(Parent, C), Unsorted),
      predsort(ch_compare, Unsorted, Children).
    
    
    nth__oldest__child(NTH0,PERSON0,NTH_CHILD,NTH_AGE)
    :-
    QUERY=(child(PERSON0,CHILD) , age(CHILD,AGE)) ,
    FORM=(age___child(AGE,CHILD)) ,
    prolog:setof(FORM,QUERY,YOUNGEST_TO_OLDESTs) ,
    lists:reverse(YOUNGEST_TO_OLDESTs,OLDEST_TO_YOUNGESTs) ,
    lists:nth1(NTH0,OLDEST_TO_YOUNGESTs,age___child(NTH_AGE,NTH_CHILD))
    .
    
    /*
    ?- nth__oldest__child(1,john,CHILD,AGE) .
    CHILD = maggie,
    AGE = 13.
    
    ?- nth__oldest__child(2,john,CHILD,AGE).
    CHILD = martinez,
    AGE = 12.
    
    ?- nth__oldest__child(3,john,CHILD,AGE).
    CHILD = mary,
    AGE = 11.
    
    ?- nth__oldest__child(4,john,CHILD,AGE).
    false.
    
    ?-
    */