duplicate_term is now copy_term
This commit is contained in:
@@ -138,8 +138,8 @@ The following predicates are built-in to rusty-wam.
|
|||||||
* `catch/3`
|
* `catch/3`
|
||||||
* `compare/3`
|
* `compare/3`
|
||||||
* `compound/1`
|
* `compound/1`
|
||||||
|
* `copy_term/2`
|
||||||
* `cyclic_term/1`
|
* `cyclic_term/1`
|
||||||
* `duplicate_term/2`
|
|
||||||
* `false/0`
|
* `false/0`
|
||||||
* `float/1`
|
* `float/1`
|
||||||
* `functor/3`
|
* `functor/3`
|
||||||
|
|||||||
@@ -325,7 +325,7 @@ pub enum BuiltInClauseType {
|
|||||||
CompareTerm(CompareTermQT),
|
CompareTerm(CompareTermQT),
|
||||||
CyclicTerm,
|
CyclicTerm,
|
||||||
Writeq,
|
Writeq,
|
||||||
DuplicateTerm,
|
CopyTerm,
|
||||||
Eq,
|
Eq,
|
||||||
Functor,
|
Functor,
|
||||||
Ground,
|
Ground,
|
||||||
@@ -377,7 +377,7 @@ impl BuiltInClauseType {
|
|||||||
&BuiltInClauseType::CompareTerm(qt) => clause_name!(qt.name()),
|
&BuiltInClauseType::CompareTerm(qt) => clause_name!(qt.name()),
|
||||||
&BuiltInClauseType::CyclicTerm => clause_name!("cyclic_term"),
|
&BuiltInClauseType::CyclicTerm => clause_name!("cyclic_term"),
|
||||||
&BuiltInClauseType::Writeq => clause_name!("writeq"),
|
&BuiltInClauseType::Writeq => clause_name!("writeq"),
|
||||||
&BuiltInClauseType::DuplicateTerm => clause_name!("duplicate_term"),
|
&BuiltInClauseType::CopyTerm => clause_name!("copy_term"),
|
||||||
&BuiltInClauseType::Eq => clause_name!("=="),
|
&BuiltInClauseType::Eq => clause_name!("=="),
|
||||||
&BuiltInClauseType::Functor => clause_name!("functor"),
|
&BuiltInClauseType::Functor => clause_name!("functor"),
|
||||||
&BuiltInClauseType::Ground => clause_name!("ground"),
|
&BuiltInClauseType::Ground => clause_name!("ground"),
|
||||||
@@ -398,7 +398,7 @@ impl BuiltInClauseType {
|
|||||||
&BuiltInClauseType::CompareTerm(_) => 2,
|
&BuiltInClauseType::CompareTerm(_) => 2,
|
||||||
&BuiltInClauseType::CyclicTerm => 1,
|
&BuiltInClauseType::CyclicTerm => 1,
|
||||||
&BuiltInClauseType::Writeq => 1,
|
&BuiltInClauseType::Writeq => 1,
|
||||||
&BuiltInClauseType::DuplicateTerm => 2,
|
&BuiltInClauseType::CopyTerm => 2,
|
||||||
&BuiltInClauseType::Eq => 2,
|
&BuiltInClauseType::Eq => 2,
|
||||||
&BuiltInClauseType::Functor => 3,
|
&BuiltInClauseType::Functor => 3,
|
||||||
&BuiltInClauseType::Ground => 1,
|
&BuiltInClauseType::Ground => 1,
|
||||||
@@ -424,7 +424,7 @@ impl BuiltInClauseType {
|
|||||||
("\\=@=", 2) => Some(BuiltInClauseType::CompareTerm(CompareTermQT::NotEqual)),
|
("\\=@=", 2) => Some(BuiltInClauseType::CompareTerm(CompareTermQT::NotEqual)),
|
||||||
("=@=", 2) => Some(BuiltInClauseType::CompareTerm(CompareTermQT::Equal)),
|
("=@=", 2) => Some(BuiltInClauseType::CompareTerm(CompareTermQT::Equal)),
|
||||||
("writeq", 1) => Some(BuiltInClauseType::Writeq),
|
("writeq", 1) => Some(BuiltInClauseType::Writeq),
|
||||||
("duplicate_term", 2) => Some(BuiltInClauseType::DuplicateTerm),
|
("copy_term", 2) => Some(BuiltInClauseType::CopyTerm),
|
||||||
("==", 2) => Some(BuiltInClauseType::Eq),
|
("==", 2) => Some(BuiltInClauseType::Eq),
|
||||||
("functor", 3) => Some(BuiltInClauseType::Functor),
|
("functor", 3) => Some(BuiltInClauseType::Functor),
|
||||||
("ground", 1) => Some(BuiltInClauseType::Ground),
|
("ground", 1) => Some(BuiltInClauseType::Ground),
|
||||||
|
|||||||
@@ -588,7 +588,7 @@ pub(crate) trait CallPolicy: Any {
|
|||||||
println!("{}", output.result());
|
println!("{}", output.result());
|
||||||
return_from_clause!(machine_st.last_call, machine_st)
|
return_from_clause!(machine_st.last_call, machine_st)
|
||||||
},
|
},
|
||||||
&BuiltInClauseType::DuplicateTerm => {
|
&BuiltInClauseType::CopyTerm => {
|
||||||
machine_st.duplicate_term();
|
machine_st.duplicate_term();
|
||||||
return_from_clause!(machine_st.last_call, machine_st)
|
return_from_clause!(machine_st.last_call, machine_st)
|
||||||
},
|
},
|
||||||
|
|||||||
22
src/tests.rs
22
src/tests.rs
@@ -1477,25 +1477,25 @@ fn test_queries_on_builtins()
|
|||||||
assert_prolog_success!(&mut wam, "?- catch(length(a, []), error(E, _), true).",
|
assert_prolog_success!(&mut wam, "?- catch(length(a, []), error(E, _), true).",
|
||||||
[["E = type_error(integer, [])"]]);
|
[["E = type_error(integer, [])"]]);
|
||||||
|
|
||||||
assert_prolog_success!(&mut wam, "?- duplicate_term([1,2,3], [X,Y,Z]).",
|
assert_prolog_success!(&mut wam, "?- copy_term([1,2,3], [X,Y,Z]).",
|
||||||
[["Z = 3", "Y = 2", "X = 1"]]);
|
[["Z = 3", "Y = 2", "X = 1"]]);
|
||||||
assert_prolog_success!(&mut wam, "?- duplicate_term(f(X, [a], Z), f(X, Y, Z)).",
|
assert_prolog_success!(&mut wam, "?- copy_term(f(X, [a], Z), f(X, Y, Z)).",
|
||||||
[["X = _3", "Y = [a]", "Z = _5"]]);
|
[["X = _3", "Y = [a]", "Z = _5"]]);
|
||||||
assert_prolog_failure!(&mut wam, "?- duplicate_term(g(X), f(X)).");
|
assert_prolog_failure!(&mut wam, "?- copy_term(g(X), f(X)).");
|
||||||
assert_prolog_success!(&mut wam, "?- duplicate_term(f(X), f(X)).",
|
assert_prolog_success!(&mut wam, "?- copy_term(f(X), f(X)).",
|
||||||
[["X = _1"]]);
|
[["X = _1"]]);
|
||||||
assert_prolog_success!(&mut wam, "?- duplicate_term([[[[X, Y], Y], X]], Term).",
|
assert_prolog_success!(&mut wam, "?- copy_term([[[[X, Y], Y], X]], Term).",
|
||||||
[["Term = [[[[_22, _26], _26], _22]]", "X = _2", "Y = _0"]]);
|
[["Term = [[[[_22, _26], _26], _22]]", "X = _2", "Y = _0"]]);
|
||||||
assert_prolog_success!(&mut wam, "?- duplicate_term([X, [Y, [X]]], Term).",
|
assert_prolog_success!(&mut wam, "?- copy_term([X, [Y, [X]]], Term).",
|
||||||
[["Term = [_12, [_16, [_12]]]", "X = _0", "Y = _4"]]);
|
[["Term = [_12, [_16, [_12]]]", "X = _0", "Y = _4"]]);
|
||||||
|
|
||||||
// test duplicate_term on cyclic terms.
|
// test copy_term on cyclic terms.
|
||||||
assert_prolog_failure!(&mut wam, "?- X = g(X, Y), Y = f(X), duplicate_term(Y, g(Z)).");
|
assert_prolog_failure!(&mut wam, "?- X = g(X, Y), Y = f(X), copy_term(Y, g(Z)).");
|
||||||
assert_prolog_success!(&mut wam, "?- X = g(X, Y), Y = f(X), duplicate_term(Y, f(Z)).",
|
assert_prolog_success!(&mut wam, "?- X = g(X, Y), Y = f(X), copy_term(Y, f(Z)).",
|
||||||
[["Y = f(g(X, Y))", "X = g(X, f(X))", "Z = g(Z, f(Z))"]]);
|
[["Y = f(g(X, Y))", "X = g(X, f(X))", "Z = g(Z, f(Z))"]]);
|
||||||
assert_prolog_success!(&mut wam, "?- X = g(X, Y), Y = f(X), duplicate_term(Y, V).",
|
assert_prolog_success!(&mut wam, "?- X = g(X, Y), Y = f(X), copy_term(Y, V).",
|
||||||
[["Y = f(g(X, Y))", "X = g(X, f(X))", "V = f(g(_9, V))"]]);
|
[["Y = f(g(X, Y))", "X = g(X, f(X))", "V = f(g(_9, V))"]]);
|
||||||
assert_prolog_success!(&mut wam, "?- f(Y,Y,[X,a,[],Y]) = Term, duplicate_term(Term, NewTerm).",
|
assert_prolog_success!(&mut wam, "?- f(Y,Y,[X,a,[],Y]) = Term, copy_term(Term, NewTerm).",
|
||||||
[["NewTerm = f(_16, _16, [_19, a, [], _16])",
|
[["NewTerm = f(_16, _16, [_19, a, [], _16])",
|
||||||
"Term = f(_0, Y, [_6, a, [], Y])",
|
"Term = f(_0, Y, [_6, a, [], Y])",
|
||||||
"X = _6", "Y = _0"]]);
|
"X = _6", "Y = _0"]]);
|
||||||
|
|||||||
Reference in New Issue
Block a user