2016-10-11 56 views
0

我在序言下列問題的工作:Prolog的約束求解器

五名患者,均具有血液測試,在醫生的手術等待,坐在長椅上由左到右,在最左側的位置是第一個。確定每位患者的位置,以及她或他的血型,年齡,身高和體重。他們的年齡是5,9,30,46和60的高度是40,48,60,65和74的權重是40,75,96,125和165

  1. 的人在遠右邊比Leila大37歲,身高60英寸。
  2. 萊拉比她身高高出56磅。
  3. 愛麗絲重75磅,身高74英寸。
  4. 阿里是AB型,重量比萊拉低56磅。
  5. 中心的人9歲,血型爲AO,體重96磅。
  6. Adam是第一個身高65英寸,體重超過身高100磅的人。
  7. 血型爲O的人比他們左邊的人大25歲。
  8. 法拉現年60歲。
  9. 血型A的人比法拉小55歲,比法拉高17英寸。
  10. 9歲但不是身高65英尺的人旁邊的人是血型B,體重125磅。

定義謂詞患者(表)其中Table是表格,其中從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). 

任何幫助表示讚賞。

回答

0

我想出了問題:我不得不加載clpr庫並從約束中刪除age(),height()和weight()項。其實,我完全刪除它們是因爲它們不需要。