定义以下谓词到一个序言程序,以便
Min
为两个数字的小X
和Y
.
min (X, Y, Min)
Run Code Online (Sandbox Code Playgroud)
你能帮我理解一下这个问题吗?
在Prolog中,我们讨论谓词.在其他语言中,您可能将其称为函数,但在数学中,我们确信函数将单个值与将某个公式应用于函数的其他一些参数的结果相关联.Prolog中没有这种方向性,因此我们将其称为谓词或关系.
这个问题的规范解决方案就是这样:
min(X, Y, Min) :- X =< Y, Min = X; Min = Y.
Run Code Online (Sandbox Code Playgroud)
在Prolog中,你总是有一个Horn子句,它有一个头部和一个身体.头是前面的,:-
并命名谓词.正文是右边的表达式列表:-
.你应该把它读作"推断min(X, Y, Min)
何时X =< Y
和Min = X
,或者Min = Y
".如果条款的主体得到满足,则推断该条款的主管.换句话说,如果X =< Y
和Min = X
,那么你可以说是min(X, Y, X)
持有.
这基本上说,如果X = <Y,那么Min是X; 否则,Min是Y.它可能更容易用多个子句表达:
min(X, Y, X) :- X =< Y.
min(X, Y, Y) :- X > Y.
Run Code Online (Sandbox Code Playgroud)
但这将创造一个不必要的选择点 ; Prolog可能认为它有多种解决方案,即使你和我都知道X只能大于或等于Y 或小于Y.(我们可以通过使用cut运算符告诉Prolog我们的意识,但是,但是当你可以使用连接和分离时,这种情况有点过头了.)