在Prolog中使用断言与事实不德克莱拉德



我是使用prolog的全新人

我想从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

你的查询不是很清楚,因为MW都是自由变量。我假设目标是这样的:

获取 X 的 M 使得 f(X,M

) 或 f(M,X),并使用动态谓词 fff 记住 M 的值。

假设我做对了,我的解决方案是:

:- 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.
?- 

最新更新