سؤال

أنا أعمل على مهمة حيث قمت بإنشاء محلل للغة حسابية تدوين البادئة.أنا بحاجة إلى كتابة المسند الذي يبني أست لأي قيمة معينة الخامس (أي.توليد أست مثل أنه كلما يتم تقييم انها قيمة الخامس).كانت فكرتي بسيطة بما فيه الكفاية:

genAst(Val, Env, Ast) :-
   ev(Ast, Env, Val).

حيث إيف هو تقييم المسند.عند تشغيل هذا أحصل على الخطأ على العنوان المتعلق بهذا الجزء من المسند إيف:

ev(xer_(power(N)), Env, V) :-
   integer(N),
   V is Env^N. %THIS LINE

حيث كل من الخامس و ن غير منضم.أنا تكافح من أجل التفكير في طريقة أنيقة أخرى للقيام بذلك, لا أحد يعرف كيف يمكن أن تجعل برولوغ توليد الأعداد الصحيحة لهذين المتغيرين?

آمل أن يكون هذا مفهوما :)

هل كانت مفيدة؟

المحلول

كما هو موضح، يبدو أن مشكلتك غير قابلة للحل، ثم أعتقد أنني سوف أسترحب بالمشكلة بأكملها بشكل مختلف، وتوليد جميع asts حتى Max Num of Tokens.

giveacodicetagpre.

غلة

giveacodicetagpre.

الحد من طول المدخلات في شاشة DCG هذه مطلوبة بسبب المبلغ غير المكرر غير المحدد // 1

نصائح أخرى

استخدام library(clpfd).يحتوي بالضبط على هذا النوع من الوظائف.وليس هناك حاجة لتوليد قيم ملموسة ، طالما أنك لا تحتاج إليها!

?- X #= Y^Z.
Y^Z#=X.

?- X #= Y^Z, [Y,Z]ins 1..3.
 Y^Z#=X,
Y in 1..3,
Z in 1..3.

?- X #= Y^Z, [Y,Z]ins 1..3, labeling([], [Y,Z]).
X = Y, Y = Z, Z = 1 ;
X = Y, Y = 1,
Z = 2 ;
X = Y, Y = 1,
Z = 3 ;
X = Y, Y = 2,
Z = 1 ;
X = 4,
Y = Z, Z = 2 ;
X = 8,
Y = 2,
Z = 3 ;
X = Y, Y = 3,
Z = 1 ;
X = 9,
Y = 3,
Z = 2 ;
X = 27,
Y = Z, Z = 3.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top