2012-09-25 54 views
1

是否有可能獲得與已內置那些謂詞(SWI中,序言),使得:謂詞來檢測是否指定Prolog項(變得更具體)

Wanted_Pred(X, a) %false 
Wanted_Pred(b, a) %false 
Wanted_Pred(X, Y) %true 
Wanted_Pred(X, X) %true 
Wanted_Pred(X, [Y|Z]) %false 
Wanted_Pred([A|B], [X,Y|Z]) %false 
Wanted_Pred([A,C|B], [X,Y|Z]) %true 

例如當且僅當成功兩個參數代表每個人的自由變重命名, 注意,因爲它結合到底論據copy_term沒有做到這一點:

copy_term(X, a) %true 
copy_term(X, [Y|Z]) %true 
copy_term([A|B], [X,Y|Z]) %true 

回答

4

subsumes_term/2完全符合您的要求,只是交換參數:

?- subsumes_term(a,X). 
false. 

?- subsumes_term(a,b). 
false. 

?- subsumes_term(Y,X). 
true. 

?- subsumes_term(X,X). 
true. 

?- subsumes_term([Y|Z],X). 
false. 

?- subsumes_term([X,Y|Z],[A|B]). 
false. 

?- subsumes_term([X,Y|Z],[A,C|B]). 
true. 

我見過SWI-Prolog的郵件列表中一個相當新的線程高效執行([email protected]=)/2,我認爲它是相關的(實際上,它也滿足您的要求):把它用好應該是最好的選擇。

編輯糾正鏈接到郵件列表。最近列表」託管到Google Groups不可用存檔開關...

你可以找到線程例如在archived discussions,搜索作者,向井邦明

+0

謝謝chac!那正是我在尋找的東西! –

0

這裏是斷言我正在尋找由我執行,但 I WANT如果在SWI-PROLOG中建立了這種類型的預測結果,則需要找出相似的結果。

true_copy(X, Y) :- 
    (X == Y, !); 
    (var(X), var(Y), !); 
    ((var(X); var(Y)) -> !, fail); 
    (atom(X), atom(Y) -> !, fail). 

true_copy([X | L1], [Y | L2]) :- 
    !, 
    true_copy(X, Y), 
    true_copy(L1, L2). 

true_copy(Term1, Term2) :- 
    Term1 =.. L1, 
    Term2 =.. L2, 
    true_copy(L1, L2). 
+1

'true_copy(F(X,X), f(_,_))。'成功。但是'f(X,X)'真的是'f(_,_)'的「真正的副本」嗎? – false