Prolog约束求解器

时间:2016-10-11 23:44:15

标签: prolog constraints

我正在研究Prolog中的以下问题:

五名患者都进行了血液检查,他们正在等待医生的手术,并且从左到右坐在长凳上,最左边的位置是第一个。确定每位患者的位置以及她或他的位置 血型,年龄,身高和体重。他们的年龄分别为5岁,9岁,30岁,46岁和60岁。他们的身高分别为40岁,48岁,60岁,65岁和74岁​​。他们的体重分别为40岁,75岁,96岁,125岁和165岁。

  1. 最右边的人比莱拉年长37岁,身高60英寸。
  2. Leila比她的身高重56磅。
  3. 爱丽丝体重75磅,身高74英寸。
  4. Ali是AB型,比Leila重56磅。
  5. 中心的人9岁,血型AO,体重96磅。
  6. 亚当是第一个身高65英寸,体重超过身高100磅的人。
  7. O型血的人比他们左边的人年长25岁。
  8. Farah已经60岁了。
  9. 血型为A的人,比Farah年轻55岁,比Farah高17英寸。
  10. 9岁那个旁边但不在65英寸高的人旁边的人是血型B,重125磅。
  11. 定义谓词患者(表),其中表是一个表,其中从1到5的行描述了按从左到右的顺序坐在工作台上的人。列是序列人的姓名,血型,年龄,身高和体重。 Table的示例值可以是Table = [['Adam','A',5,40,40],['Ali','AB',9,48,75],['Alice','AO ',30,60,96],['Farah','B',46,65,125],['Leila','O',60,74,165]。

    我认为我非常接近解决方案,尽管我的程序运行不正常。我将在下面粘贴我的代码:

    :- op(100,xfy,on).
    
    age(5). age(9). age(30). age(46). age(60).
    height(40). height(48). height(60). height(65). height(74).
    weight(40). weight(75). weight(96). weight(125). weight(165).
    
    patients(Table) :-
    
        makebench(5, Table),
        Table = [_, _, _, _, [_, _, Age5, 60, _]],
        ['Leila', _, AgeLeila, HeightLeila, WeightLeila] on Table,
        ['Alice', _, _, 74, 75] on Table,
        ['Ali', 'AB', _, _, WeightAli] on Table,
        Table = [_, _, [_, 'AO', 9, _, 96], _, _],
        Table = [['Adam', _, _, 65, 165], _, _, _, _],
        rightof([_, 'O', A, _, _], [_, _, A1, _, _], Table),
        ['Farah', _, 60, HeightFarah, _] on Table,
        [_, 'A', 5, H, _] on Table,
        Table = [_, _, _, [_, 'B', _, _, 125], _],
    
    {   Age5 = AgeLeila + 37,
        WeightLeila = HeightLeila + 56,
        WeightAli = WeightLeila - 56,
        A = A1 + 25,
        H = HeightFarah + 17,
        age(Age5),
        age(AgeLeila),
        weight(WeightLeila),
        height(HeightLeila),
        weight(WeightAli),
        height(HeightFarah)}.
    
    makebench(0, []).
    
    makebench(N, [[_, _, _, _, _]|List]) :-
        N > 0, N1 is N - 1, makebench(N1,List).
    
    X on [X | _].
    X on [_ | R] :- X on R.
    
    sublist(S, L) :- add(S, _, L).
    sublist(S, [_ | T]) :- sublist(S, T).
    
    add([], L, L).
    add([X | R], Y, [X | T]) :- add(R,Y,T).
    
    rightof(H1, H2, L) :- sublist([H2, H1], L).
    

    感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

我发现了问题:我必须加载clpr库并从约束中删除age(),height()和weight()项。实际上,我完全删除了它们,因为它们不需要。