Prolog在搜索解决方案时会失败,当有解决方案时

时间:2018-02-23 15:22:46

标签: prolog

大家好:)我在prolog编程时遇到了问题。我将部分顺序定义为事实,并且我将最大和最大元素定义为谓词。我们可以将偏序视为大于或等于,所以le(6,7)就像6 <= 7。

le(6,7).
le(4,4).
le(6,6).
le(5,6).
le(5,5).
le(4,5).
le(4,4).

maximal(X) :-
    not((le(X,Z) , X\=Z)).
greatest(X) :-
    not(le(X,_)).
minimal(X) :-
    not((le(Z,X) , X\=Z)).
smallest(X) :-
    not(le(_,X)).

当我输入类似于maximal(7)的查询时,prolog输出为true,当我要求prolog找到像maximal(X)这样的解时,它会让mi失败。我是初学prolog程序员,很抱歉,如果这个问题太微不足道了,但我找不到自己的解决方案。

1 个答案:

答案 0 :(得分:2)

Prologs使用预先定义的步骤来找到答案,而否定总是很棘手。

总而言之,为了使代码更易于推理,大多数逻辑应该是正面的,否定应用于所有变量的值都已知的表达式。

以下是如何使代码工作的方法。

le(6,7).
le(4,4).
le(6,6).
le(5,6).
le(5,5).
le(4,5).
le(4,4).

is_my_number(X) :- le(X, _).
is_my_number(X) :- le(_, X).

equal_or_not_le(X, Y) :- X = Y.
equal_or_not_le(X, Y) :- not(le(X, Y)).

maximal(X) :- is_my_number(X), forall(is_my_number(Y), equal_or_not_le(X, Y)).

然后查询:

?- maximal(X).
X = 7 .
祝你好运!