我是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中使用它们。你的例子没那么有用。
答案 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).