2013-03-25 71 views
0

我正在尝试编写一个Prolog元解释器来选择目标执行的顺序,例如首先使用最少数量的参数执行所有目标。在Prolog解释器中更改目标执行顺序

solve2(true). 
solve2(A) :- builtin(A), !, A. 
solve2((A,B)) :- solve2(A), solve2(B). 
solve2(A) :- clause(A,B), solve2(B). 

然后我去像

solve2(true). 
solve2(A) :- builtin(A), !, A. 
solve2((A,B)) :- count(A,Args), count(B,Args2), Args<Args2, solve2(A), solve2(B). 
solve2((A,B)) :- count(A,Args), count(B,Args2), Args>Args2, solve2(B), solve2(A). 
solve2(A) :- clause(A,B), solve2(B). 

但是,如果执行4号线在此之前执行整个块B:

我从香草元解释开始这是错误的。

Ex。 A = a(x,y),B =(b(x,y,z),c(x))我想执行c,然后a,然后b。 - 而在这种方法中,我会得到c,b,然后a。 我正在考虑改变列表中的目标,但我不太确定。

任何想法?

+1

没有在你的程序的逻辑不断深入,你会发现,在第二个上市的第4行有一个' Args> Args'(它永远不会是真的),而我认为你的意思是说'Args> Args2'? – 2013-03-25 10:12:34

+0

在这里发帖的错误,我会解决它! – Enoon 2013-03-25 10:37:25

+0

阅读这个不错的介绍:http://web.student.tuwien.ac.at/~e0225855/acomip/acomip.html – false 2013-03-25 15:27:06

回答

1

这是一个(未经测试的)香草元翻译器,改变了连接顺序。如果您可以尝试使用您的数据,我会很高兴。

solve2(true). 
solve2(A) :- builtin(A), !, A. 
solve2((A,B)) :- ordering(A,B, C,D), ! /* needed */, solve2(C), solve2(D). 
solve2(A) :- clause(A,B), solve2(B). 

ordering(A,B, C,D) :- 
    minargs(A, NA), 
    minargs(B, NB), 
    (NA =< NB -> C/D=A/B ; C/D=B/A). 

minargs((A,B), N) :- 
    minargs(A, NA), 
    minargs(B, NB), 
    !, (NA =< NB -> N=NA ; N=NB). 
minargs(T, N) :- 
    functor(T, _, N). 

编辑我使用此设置进行测试:

builtin(writeln(_)). 

a(1):-writeln(1). 
b(1,2):-writeln(2). 
c(1,2,3):-writeln(3). 

test :- 
    solve2((c(A,B,_),a(A),b(A,B))). 

,并得到了预期的输出:

?- test. 
1 
2 
3 
true . 

编辑我不得不求助于一个列表表示,但随后它是有意义的预处理条款和获得正确的或德前,然后坚持到普通的香草解释:

test :- 
    sortjoin((b(A,B),a(A),c(A,B,_)), X), 
    solve2(X). 

sortjoin(J, R) :- 
    findall(C-P, (pred(J, P), functor(P,_,C)), L), 
    sort(L, T), 
    pairs_values(T, V), 
    join(V, R). 

join([C], C). 
join([H|T], (H,R)) :- join(T, R). 

pred((A, _), C) :- 
    pred(A, C). 
pred((_, B), C) :- 
    !, pred(B, C). 
pred(C, C). 

其中solve2((A,B)) :- ...它的原始solve2(A),solve2(B)

+0

谢谢! 唯一的问题是,如果你给他一些应该失败的东西,它会挂起。 Ex:solve2((c(A,B,_),a(A),b(2,B)))。 你知道为什么吗? :) – Enoon 2013-03-25 11:35:16

+0

查看上次编辑,我添加了一个剪辑,现在似乎可以正常工作(即失败)。 – CapelliC 2013-03-25 11:45:42

+0

谢谢,这很好。对于本应该失败的谓词,我有类似的问题 - 我必须学习如何使用剪辑。 :) – Enoon 2013-03-25 12:28:21