我想知道如何使用一个谓词在Prolog中对这个问题做出答案(或第一个函数)?我所指的链接是here。
这是一个我只想调用一个谓词的例子:
reverse([X|Y],Z,W) :- reverse(Y,[X|Z],W).
reverse([],X,X).
答案 0 :(得分:0)
你想做什么,为什么你只想要一个谓词的子句?
我个人认为有能力编写多个子句是prolog的优点之一,代码更优雅,更具可读性
无论如何,你可能想要使用或。假设您有以下条款:
foo(Arg11,Arg12,Arg13):-
(Body1).
foo(Arg21,Arg22,Arg23):-
(Body2).
foo(Arg31,Arg32,Arg33):-
(Body3).
你首先要确保每个子句都有相同的参数(再见模式匹配!):
foo(Arg1,Arg2,Arg3):-
(Body1b).
foo(Arg1,Arg2,Arg3):-
(Body2b).
foo(Arg1,Arg2,Arg3):-
(Body3b).
然后你将使用或(;):
foo(Arg1,Arg2,Arg3):-
(Body1b)
; (Body2b)
; (Body3b).
例如,
reverse([X|Y],Z,W):-
reverse(Y,[X|Z],W).
reverse([],X,X).
将成为:
reverse(X,Y,Z):-
X = [H|T],
reverse(T,[H|Y],X).
reverse(X,Y,Z):-
X = [],
Z = Y.
然后:
reverse(X,Y,Z):-
(X = [H|T],
reverse(T,[H|Y],X) )
; (X = [],
Z = Y). *%ew ew ugly!*
关于第一篇文章中的示例,有两个不同的谓词,每个谓词只有一个子句。第二个谓词有2个参数,而第一个谓词有1个,因此它们是不同的。 “合并”它们的唯一方法是简单地将第二个称为has_equal_sums(List,_)代替第一个。
说实话,我没有看到这样做的意义;我怀疑你不会得到任何显着的加速,而且代码变得更加混乱 当然,这是你的代码,可能存在我们不知道的限制(这就是我问你要完成什么的原因)