如何在一个功能中执行此操作

时间:2011-05-04 18:05:47

标签: prolog

我想知道如何使用一个谓词在Prolog中对这个问题做出答案(或第一个函数)?我所指的链接是here

这是一个我只想调用一个谓词的例子:

reverse([X|Y],Z,W) :- reverse(Y,[X|Z],W).
reverse([],X,X).

1 个答案:

答案 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,_)代替第一个。

说实话,我没有看到这样做的意义;我怀疑你不会得到任何显着的加速,而且代码变得更加混乱 当然,这是你的代码,可能存在我们不知道的限制(这就是我问你要完成什么的原因)