2012-07-31 69 views
1

如果給定版本具有給定的順序關係,則編寫謂詞complst/3。順序將是:lt,le,gt,ge或eq(小於,小於或等於,大於,大於或等於,等於)中的一個,謂詞應該對所有適用的關係。例如,如何用Prolog編寫complst/3謂詞?

?- complst([2,3,4], [2,3,5], C). 
C = lt ; 
C = le . 

?- complst([1,2,3,4], [1,1,8], C). 
C = gt ; 
C = ge . 

爲了獲得目標,我寫了一個斷言:

complst([], [], Cmp) :- 
    Cmp = eq, !. 

complst([A], [B], Cmp) :- 
    A > B, 
    Cmp = gt. 

complst([A], [B], Cmp):- 
    A < B, 
    Cmp = lt. 

complst([A], [B], Cmp):- 
    A >= B, 
    Cmp = ge. 

complst([A], [B], Cmp):- 
    A =< B, 
    Cmp = le. 

complst([], [B], Cmp):- 
    Cmp = le, !. 

complst([], [B], Cmp):- 
    Cmp = lt, !. 

complst([A], [], Cmp):- 
    Cmp = ge, !. 

complst([A], [], Cmp):- 
    Cmp = gt, !. 

complst([X|XS], [Y|YS], Cmp):- 
    X > Y, 
    cmp_list([X], [Y], Cmp). 

complst([X|XS], [Y|YS], Cmp):- 
    X < Y, 
    cmp_list([X], [Y], Cmp). 

complst([X|XS], [Y|YS], Cmp):- 
    X == Y, 
    cmp_list(XS, YS, Cmp). 

但問題是,輸出將永遠不會停止,除非我按enter鍵。 任何人都可以幫我解決這個問題嗎? 在此先感謝!

回答

1

以這種方式比較兩個軟件版本列表只有三種可能性。第一個小於,等於或大於第二個。在第一種情況下適合lt,le。在第二種情況下le,eq,ge合適。在第三個 - ge,gt

這意味着您可以將兩個列表中的元素進行兩兩比較。一旦檢測到第一種或第三種情況,您可以立即生成這些值。否則,繼續下一對或元素。

遞歸沿着兩條列出標準框架是

recur([], [], X):- end_of_two_lists_reached(X). 
recur([], [_|_], X):- second_list_is_longer(X). 
recur([_|_], [], X):- first_list_is_longer(X). 
recur([A|A2], [B|B2], X):- two_elements_are(A,B,C), 
    ( continue_recursing(C) 
    -> recur(A2,B2,X) 
    ; stop_recursing(C,X) 
).