2013-02-17 76 views
6

我試圖定義一個謂詞內聯以將它傳遞給Prolog中的另一個謂詞。在序言中定義謂詞內的謂詞

% Test if a "product" of graphs G1 and G2 has a "mini-loop" starting from Q 
test_property_combined(G1,G2,Q):- 
    (g12(Q1,Q2) :- combine(G1,G2,Q1,Q2)), 
    some_property(g12,Q). 

(上面的語法顯然是錯誤的。)

後來g12將由call

% Test if a graph G has a "mini-loop" starting from Q 
some_property(G,Q):- 
    Goal1 =.. [G,Q,C], 
    Goal2 =.. [G,C,Q], 
    call(Goal1), 
    call(Goal2). 

的問題仍然存在,因爲我想在某種測試some_property調用先前定義的謂詞的集合。

% Create a "product" of graphs G1 and G2 
combine(G1,G2,(Q1,Q2),(Q3,Q4)):- 
    Goal1 =.. [G1,Q1,Q3], 
    Goal2 =.. [G2,Q2,Q4], 
    call(Goal1), 
    call(Goal2). 

所提及的謂詞和測試查詢的一個例子:

% g1 and g2 are graphs 
g1(a,b). 
g1(b,a). 

g2(c,d). 
g2(d,c). 


?- test_property_combined(g1,g2,(a,c)). 

一個人如何去這樣做呢?

+0

對不起,我不明白這一點。你知道[lambda](http://www.complang.tuwien.ac.at/ulrich/Prolog-inedit/lambda.pl)嗎? – CapelliC 2013-02-17 07:47:43

+0

不,但在這裏使用它似乎有點矯枉過正。感謝您的鏈接。 – 2013-02-17 13:17:25

+0

不要使用'(= ..)/ 2'來模擬高階編程。改用call/N。使用['library(lambda)'](http://www.complang.tuwien.ac.at/ulrich/Prolog-inedit/ISO-Hiord) – false 2013-02-17 17:22:01

回答

2

我不知道獲得分數,但這個工程:

test_property_combined(G1,G2,Q):- 
    assert((g12(Q1,Q2) :- combine(G1,G2,Q1,Q2))), 
    some_property(g12,Q). 

好吧,可能是完整的代碼類似的東西

:- use_module(library(lambda)). 

test_property_combined(G1,G2,Q):- 
    % (g12(Q1,Q2) :- combine(G1,G2,Q1,Q2)), 
    Pred = \Z^T^combine(G1,G2,Z,T), 
    some_property(Pred,Q). 


combine(G1,G2,(Q1,Q2),(Q3,Q4)):- 
    Goal1 =.. [G1,Q1,Q3], 
    Goal2 =.. [G2,Q2,Q4], 
    call(Goal1), 
    call(Goal2). 


some_property(G,Q):- 
    call(G, Q, C), 
    call(G, C, Q). 

最後編輯(希望如此):

test_property_combined(G1,G2,Q):- 
    some_property(combine(G1,G2),Q). 

combine(G1,G2,(Q1,Q2),(Q3,Q4)):- 
    call(G1,Q1,Q3), 
    call(G2,Q2,Q4). 

some_property(G,Q):- 
    call(G, Q, C), 
    call(G, C, Q). 

g1(a,b). 
g1(b,a). 

g2(c,d). 
g2(d,c). 

@false =>有用的評論,像往常一樣!

+1

不要忘記清理通過收回臨時謂詞。 – 2013-02-17 09:15:06

+1

是的**縮進(g12(__,__))**。 – joel76 2013-02-17 11:55:50

+0

謝謝,這個工程。這實際上是我的實際代碼的淡化版本,但我希望在這裏需要定義一個內聯謂詞仍然有意義。 – 2013-02-17 12:49:05