Prolog列表,参数和返回值

时间:2010-06-04 22:20:18

标签: list parameters prolog

我是prolog的新手,我无法理解这一点。

我正在尝试构建一个简单的程序,它接收一个谓词列表,搜索列表中的特定谓词,并将一个函数应用于该谓词的参数。

这些方面的东西:

?- program([pred1(a,b,p), pred2(d,b,p), pred2 (a,c,p)]). 

program (list1) :- 
search(pred2(X,Y,p),list1).
doSomething (X,Y) % with the X and Y returned from search function, both of them.

基本上,我想使用从目标search(pred2(X,Y,p),list1)返回的所有值,并在另一个函数上使用它们。


好的,我在prolog中试了一些东西然后来了:

member(X, [X | _]).

member(X, [_ | R]) :- member(X, R).

prog(L1,Out) :- member(pred2(X,Y), L1).

?- prog ([(pred1(a,b),pred2(c,b),pred2(d,a)],Out).

它实际上提供了2次,但我希望获得Out = [c,b]Out = [d,a]。我怎么能做到这一点?

关于Oak的回答:我认为它不是一种过程语言,但我无法弄清楚如何访问值并在prolog中使用它们。你的例子没那么有用。

2 个答案:

答案 0 :(得分:7)

首先,我会避免将这些东西称为“功能”。 Prolog不是一种过程语言,规则/谓词不是函数。

基本上,当你使用规则时,你真的在​​问Prolog,“给我所有符合这条规则的价值”。该规则本身并不会返回任何内容。

所以说你用程序语言有以下内容:

f(g(3))

你会如何在Prolog中做到这一点?您需要编写一些谓词f(X,Y)和一些谓词g(X,Y),然后您需要使用查询f(3,Y), g(Y,Z) - 这意味着要求Prolog找到{{1}的值}和Y将满足这一要求。 Z是您感兴趣的内容。

答案 1 :(得分:0)

接近这些过滤器的最佳方式&我认为prolog中的项目需求是编写过滤器表达式,使得它接受一个参数并在输入参数通过过滤器时成功 -

iseven(Num) :- 0 is Num % 2 .

然后将投影代码写为一个作为输入的参数,一个作为输出 -

triple(NumIn, NumOut) :- NumOut is NumIn * 3 .

然后将它们绑在一起 -

triple_evens(NumIn, NumOut) :- iseven(NumIn), triple(NumIn, NumOut).

然后在列表的每个成员上运行它,我们应该使用findall -

triple_evens_in_list(Lin, Lout) :-
    findall(Num, ( member(NumL, Lin),
                   triple_evens(NumL, Num)
                 ), LOut).

这可以概括为将过滤器的名称作为参数。当然是地图谓词。并且它也可以以形式压缩到一个stmt -

findall(Num, ( member(M, List), 0 is M % 2, Num is M * 3 ), ListOut).