0

私はプロローグを使用してまったく新しいです

f結果を取得して、重複せずに新しいファクトに入れ たい

f(1,2).
f(1,3).
f(1,10).
f(9,1).

get(X,M):-
    (f(X,W);f(W,X)),
    (not(fff(W)),not assert(fff(W)));fff(M) .

それは機能していませんが、最初の行を機能さUnknown clause found fff(2) せようとしたとき、それは最善の解決策ではありませんassert(fff(-1))get

誰もが宣言するより良い方法を私に与えることができますfff

4

1 に答える 1

2

MWはどちらも自由変数であるため、クエリはあまり明確ではありません。目標は次のようなものだと思います。

f(X,M) または f(M,X) となるような X の M を取得し、動的述語 を使用して M の値をメモしますfff

私がそれを正しく理解したと仮定すると、私の解決策は次のようになります。

:- dynamic( fff/1 ).

f(1,2).
f(1,3).
f(1,10).
f(9,1).

get( X, W ) :-
  f( X, W ),
  assert_fff( W ).
get( X, W ) :-
  f( W, X ),
  assert_fff( W ).

assert_fff( W ) :-
  fff( W ),
  !.
assert_fff( W ) :-
  asserta( fff( W ) ).

出力:

Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 5.10.4)
Copyright (c) 1990-2011 University of Amsterdam, VU Amsterdam
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to redistribute it under certain conditions.
Please visit http://www.swi-prolog.org for details.

For help, use ?- help(Topic). or ?- apropos(Word).

?- consult('test.pl').
% test.pl compiled 0.00 sec, 2,440 bytes
true.

?- listing(fff).
:- dynamic fff/1.

true.

?- get(1, W).
W = 2 ;
W = 3 ;
W = 10 ;
W = 9.

?- listing(fff).
:- dynamic fff/1.

fff(2).
fff(3).
fff(10).
fff(9).

true.

?- 
于 2013-10-17T18:35:02.293 に答える