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(X, a) %true 
copy_term(X, [Y|Z]) %true
copy_term([A|B], [X,Y|Z]) %true
4

2 に答える 2

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.

(=@=) /2の効率的な実装に関する SWI-Prolog メーリング リストのかなり最近のスレッドを見たことがあります。利用可能な最良のオプション。

メーリングリストへのリンクを修正して編集します。最近、リストのホストを Google グループに切り替えたため、アーカイブが利用できなくなりました...

たとえば、アーカイブされたディスカッションでスレッドを見つけることができます。作成者である向井邦明を検索してください。

于 2012-09-26T07:16:50.230 に答える
0

これが私が実装した検索中の述語ですが、この 種の述語がSWI-PROLOG の BUILT_IN または類似のものであるかどうかを知りたいです。

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).  
于 2012-09-26T00:38:52.710 に答える