在prolog中与事实一起使用assert不可撤销

在prolog中与事实一起使用assert不可撤销,prolog,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) . 在fff(2)中找到的未知子句不起作用 但是,当我试图将assert(fff(-1))放在get的第一行时,这并不是最好的解决方案 任何人都可以给我一个更好的方法来声明一个fff你的

我是一个全新的使用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) .
在fff(2)中找到的未知子句不起作用

但是,当我试图将
assert(fff(-1))
放在
get
的第一行时,这并不是最好的解决方案


任何人都可以给我一个更好的方法来声明一个
fff

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

获取X的M,使f(X,M)或f(M,X),并使用动态谓词
fff
记录M的值

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

:-动态(fff/1)。
f(1,2)。
f(1,3)。
f(1,10)。
f(9,1)。
得到(X,W):-
f(X,W),
断言(W)。
得到(X,W):-
f(W,X),
断言(W)。
断言(W):-
fff(W),
!.
断言(W):-
资产(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.

?- 

什么是fff?您仅定义谓词
f
get
fff
是一个动态事实,包含结果…工作正常,但不是最佳解决方案-您能定义“最佳”的含义吗?在我的解决方案中,添加一个新值实际上不存在-1谢谢,但是,当我重新获得此消息时,位置3处出现
PIE语法错误:意外标记:atom(“dynamic”)
我使用的是
prolog推理引擎
不同版本的prolog略有不同。上面的输出来自SWI Prolog。如果Prolog版本中的
:-dynamic
指令不起作用,请尝试将其删除。如果这不起作用,请查看您版本的文档,了解如何将谓词声明为动态的。ISO Prolog标准不要求
dynamic
作为运算符。如果将第一行更改为
:-dynamic(fff/1),问题是否会消失。
?可能
dynamic
不是关键字:(