2012-07-31 112 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) 
).