在prolog中与事实一起使用assert不可撤销
我是一个全新的使用prolog的人 我想从在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你的
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
不是关键字:(